一対多[1:N]

7634 ワード

一方向



[Member]
@Entity
public class Member {
	
    @Id @GeneratedValue
    @Column(name="MEMBER_ID")
    private Long id;
    
    @Column(name="USERNAME")
    private String username;
    
    // getter, setter...
}
[Team]
@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name="TEAM_ID")
    private Long id;
    
    @Column(name="NAME")
    private String name;
    
    @OneToMany
    @JoinColumn(name="TEAM_ID")
    private List<Member> members = new ArrayList<>();
    
    // getter, setter..
}
[JpaMain]
Member member = new Member();
member.setUsername("member1");
em.persist(member);

Team team = new Team();
team.setName("teamA");
team.getMembers().add(member);
em.persist(team);
[JpaMain実行時に発行されたクエリー]
INSERT INTO MEMBER (USERNAME, MEMBER_ID) VALUES ('member1', 1);
INSERT INTO TEAM (NAME, TEAM_ID) VALUES ('teamA', 1);
UPDATE MEMBER SET TEAM_ID = 1 WEHRE MEMBER_ID = 1;

整理する

  • 一帯多方向は一対多(1:N)の中で、日(1)は関連関係の主人である.
  • テーブルの一対の多関係はいつも多(N)面に外来キーがある.
  • オブジェクトとテーブルの違いにより、エンティティはテーブルの外部キーを管理する特殊な構造です.
  • @JoinColumnを使用する必要があります.それ以外の場合は、結合テーブルを作成する方法で使用します.
  • 短所

  • エンティティが管理する外部キーは、別のテーブルにあります.
  • 関連関係を管理するために、追加のUPDATE SQLを実行します.
  • 1対のマルチ一方向マッピングを使用するよりも、マルチ対1の双方向マッピングを使用します.(より直感的)

    リファレンス


    JPAに関する講座もそうですが、関連記事を見ると双方向関係よりも一方向関係の方がおすすめです.しかし、これは半分対半分の間違った主張だ.
    正確には、多対一(N:1)の一方向関連関係を用いることが推奨される.
    これは一方通行は双方向よりいいですか?便で確認できます.