使用JPA连接不区分大小写的PK和FK的表

时间:2016-12-01 19:12:24

标签: java hibernate jpa jointable

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

    ......
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

}

试试这个。