加入关于不区分大小写的PK和FK与JPA

问题描述:

我有两张表我想加入JPA中的PK和FK,但PK是大写和FK小写。加入关于不区分大小写的PK和FK与JPA

如何映射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 Class上没有'memberOf'字段。当你在类上使用'@ JoinColumn'时,他们需要有一个这样的字段。 – msagala25

+0

它不一定是。 'memberOf'只是链接表中的一列。 –

我换你的映射:

@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

@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; 

} 

尝试。