2016-12-01 5 views
1

JPAでPKとFKに結合したいテーブルが2つありますが、PKは大文字でFK小文字です。JPAで大文字と小文字を区別しないPKとFKのテーブルを結合する

Person - > GroupAssociationEntityの間で大文字と小文字を区別しない関連付けをどのようにしてマッピングできますか?

現在のマッピングが機能していません。

@Entity 
public class Person { 

    @Id 
    @Column(name = "id", columnDefinition = "nvarchar") 
    private String id; 


    @OneToMany(mappedBy = "person") 
    private List<GroupAssociationEntity> groups; 
} 

@Entity 
@IdClass(GroupAssociationKey.class) 
public class GroupAssociationEntity { 

    @Id 
    private String id; 

    @Id 
    private String memberOf; 

    @ManyToOne 
    @JoinColumn(name = "id", updatable = false, insertable = false, referencedColumnName = "id") 
    private Group group; 

    @ManyToOne 
    @JoinColumn(name = "memberOf", updatable = false, insertable = false, referencedColumnName = "id") 
    private Person person; 

    .... 
} 

@Entity 
public class Group { 

    @Id 
    @Column(name = "id") 
    private String id; 

    @OneToMany(mappedBy = "group") 
    private List<GroupAssociationEntity> persons; 

    ...... 
} 
+0

Personクラスには 'memberOf'フィールドはありません。クラスの '@ JoinColumn'を実行するときには、そのフィールドを持つ必要があります。 – msagala25

+0

そうである必要はありません。 'memberOf'はリンクテーブルの単なる列です。 –

答えて

1

私はあなたにマッピングを切り替える:

@Entity(name = "Person") 
public static class Person { 

    @Id 
    @Column(name = "id") 
    private String id; 


    @OneToMany(mappedBy = "person") 
    private List<GroupAssociationEntity> groups; 
} 

@Entity(name = "GroupAssociationEntity") 
public static class GroupAssociationEntity { 

    @EmbeddedId 
    private GroupAssociationKey id; 

    @ManyToOne 
    @MapsId("id") 
    private Group group; 

    @ManyToOne 
    @MapsId("memberOf") 
    private Person person; 
} 

@Embeddable 
public static class GroupAssociationKey implements Serializable{ 

    private String id; 

    private String memberOf; 

    public GroupAssociationKey() { 
    } 

    public GroupAssociationKey(String id, String memberOf) { 
     this.id = id; 
     this.memberOf = memberOf; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getMemberOf() { 
     return memberOf; 
    } 

    public void setMemberOf(String memberOf) { 
     this.memberOf = memberOf; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof GroupAssociationKey)) return false; 
     GroupAssociationKey that = (GroupAssociationKey) o; 
     return Objects.equals(getId(), that.getId()) && 
       Objects.equals(getMemberOf(), that.getMemberOf()); 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hash(getId(), getMemberOf()); 
    } 
} 

@Entity(name = "Group") 
@Table(name = "groups") 
public static class Group { 

    @Id 
    @Column(name = "id") 
    private String id; 

    @OneToMany(mappedBy = "group") 
    private List<GroupAssociationEntity> persons; 

} 

とSQL ServerとMySQLの両方で、このテストを実行します。

doInJPA(entityManager -> { 

    Person person1 = new Person(); 
    person1.id = "abc1"; 
    entityManager.persist(person1); 

    Person person2 = new Person(); 
    person2.id = "abc2"; 
    entityManager.persist(person2); 

    Group group = new Group(); 
    group.id = "g1"; 
    entityManager.persist(group); 

    GroupAssociationEntity p1g1 = new GroupAssociationEntity(); 
    p1g1.id = new GroupAssociationKey("G1", "ABC1"); 
    p1g1.group = group; 
    p1g1.person = person1; 
    entityManager.persist(p1g1); 

    GroupAssociationEntity p2g1 = new GroupAssociationEntity(); 
    p2g1.id = new GroupAssociationKey("G1", "ABC2"); 
    p2g1.group = group; 
    p2g1.person = person2; 
    entityManager.persist(p2g1); 
}); 

doInJPA(entityManager -> { 
    Group group = entityManager.find(Group.class, "g1"); 
    assertEquals(2, group.persons.size()); 
}); 

doInJPA(entityManager -> { 
    Person person = entityManager.find(Person.class, "abc1"); 
    assertEquals(1, person.groups.size()); 
}); 

そして、それだけで正常に動作します。 GitHubで確認してください。

0
@Entity 
public class Person { 

    @Id 
    @Column(name = "id", columnDefinition = "nvarchar") 
    private String id; 

} 

@Entity 
@IdClass(GroupAssociationKey.class) 
public class GroupAssociationEntity { 

    @Id 
    private String id; 

    @Id 
    private String memberOf; 

    @ManyToOne 
    @JoinColumn(name = "id", updatable = false, insertable = false, referencedColumnName = "id") 
    private Group group; 

    @ManyToOne 
    @JoinColumn(name = "id", updatable = false, insertable = false, referencedColumnName = "id") 
    private Person person; 

    .... 
} 

@Entity 
public class Group { 

    @Id 
    @Column(name = "id") 
    private String id; 

} 

これを試してみてください。

関連する問題