【问题标题】:Join table on case insensitive PK and FK with JPA使用 JPA 连接不区分大小写的 PK 和 FK 表
【发布时间】:2016-12-01 19:12:24
【问题描述】:

我有 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;

    ......
}

【问题讨论】:

  • Person 类上没有 memberOf 字段。当你 @JoinColumn 在一个类上时,他们需要有一个字段。
  • 不必如此。 memberOf 只是链接表中的一列。

标签: java hibernate jpa jointable


【解决方案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

【讨论】:

    【解决方案2】:
    @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;
    
    }
    

    试试这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2013-03-06
      相关资源
      最近更新 更多