使用 JPA 加入 table 不区分大小写的 PK 和 FK

Join table on case insensitive PK and FK with JPA

我有 2 个表想加入 JPA 中的 PK 和 FK,但是 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;

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

}

试试这个。

我将你的映射切换为:

@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 服务器和 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.

上查看