加入关于不区分大小写的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;
......
}
答
我换你的映射:
@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;
}
尝试。
Person Class上没有'memberOf'字段。当你在类上使用'@ JoinColumn'时,他们需要有一个这样的字段。 – msagala25
它不一定是。 'memberOf'只是链接表中的一列。 –