@JoinColumns 在两个表上都具有复合主键

问题描述 投票:0回答:1

我必须使用几个像这样的表来映射旧数据库

---------
- GROUP -
---------
+idcust -
+key    -
+idgroup- 
-domain -
---------

pk(idcust,key,idgroup)

------------------
-   GROUP_LABEL  -
------------------
+idcust          -
+key             -
+idgroup         - 
+idlabel         -
-domain          -
-description_lang-
------------------

pk(idcust,key,idgroup,idlabel)
fk(idcust,key,idgroup) references group.pk

两者都有复合主键,并且后者具有第一个的所有字段。我无法更改表格,所以我只能按原样映射它们。

以下是课程:

这是为了关系的一方面

@Embeddable
public class GroupId implements Serializable {

  private static final long serialVersionUID = 7202018350067509393L;

  @Column(name = "idcust")
  private String idCust;
  @Column(name = "key")
  private String key;
  @Column(name = "idgroup")
  private Long idGroup;

  //getters, setters, hashcode, equals

}

@Entity
@Table(name = "group")
public class Group{

  @EmbeddedId
  private GroupId groupId;

  @Column(name = "domain")
  private String domain;

  @OneToMany(mappedBy="group", fetch=FetchType.EAGER)
  private Set<GroupLabels> groupLabels;

  //getters, setters

}

虽然这是针对多方的

@Entity
@Table(name = "group_labels")
public class GroupLabels{

    @EmbeddedId
    private GroupLabelsId groupLabelsId;

    @Column(name = "description_lang")
    private String descriptionLang;

    @Column(name = "domain")
    private String domain;

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="idcust", referencedColumnName="idcust" ,insertable=false, updatable=false),
        @JoinColumn(name="key", referencedColumnName="key" ,insertable=false, updatable=false),
        @JoinColumn(name="idgroup", referencedColumnName="idgroup" ,insertable=false, updatable=false)
    })
    private Group group;

//getters, setters

}   


@Embeddable
public class GroupLabelsId implements Serializable {

    private static final long serialVersionUID = 761043173785225772L;

    @Column(name = "idcust")
    private String idCust;
    @Column(name = "key")
    private String key;
    @Column(name = "idgroup")
    private Integer idGroup;
    @Column(name = "idlabel")
    private Integer idLabel;

//getters, setters, hashcode, equals

}

这种映射是有效的,因为我能够检索实体,但是,我查看了这个简单测试生成的 sql:

@Test
public void testIntegrity(){
    Group got = (Group) sessionFactory.getCurrentSession().createCriteria(Group.class)
            .add(Restrictions.idEq(groupSaved.getGroupId())).uniqueResult();
    assertEquals(groupSaved.getGroupId(),got.getGroupId());

}

这是sql代码:

select
        this_.idcust as idcust1_0_1_,
        this_.idgroup as idgroup2_0_1_,
        this_.key as key3_0_1_,
        this_.domain as domain4_0_1_,
        grouplabel2_.idcust as idcust1_0_3_,
        grouplabel2_.idgroup as idgroup2_0_3_,
        grouplabel2_.key as key4_0_3_,
        grouplabel2_.idcust as idcust1_1_3_,
        grouplabel2_.idgroup as idgroup2_1_3_,
        grouplabel2_.idlabel as idlabel3_1_3_,
        grouplabel2_.key as key4_1_3_,
        grouplabel2_.idcust as idcust1_1_0_,
        grouplabel2_.idgroup as idgroup2_1_0_,
        grouplabel2_.idlabel as idlabel3_1_0_,
        grouplabel2_.key as key4_1_0_,
        grouplabel2_.description_lang as descript5_1_0_,
        grouplabel2_.domain as domain6_1_0_ 
    from
        group this_ 
    left outer join
        group_labels grouplabel2_ 
            on this_.idcust=grouplabel2_.idcust 
            and this_.idgroup=grouplabel2_.idgroup 
            and this_.key=grouplabel2_.key 
    where
        this_.idcust=? 
        and this_.key=? 
        and this_.domain=?

如您所见,它多次检索第二个实体的 id,这让我相信我的映射不是最优的。

我使用 Hibernate 4.3.10 作为 ORM。

有没有办法可以纠正@JoinColumns以避免多列检索?

hibernate one-to-many composite-primary-key jpa-2.1 joincolumn
1个回答
0
投票

我认为你可以使用@PrimaryKeyJoin

这只是一个猜测,我有同样的问题,我发现了这个问题但没有答案,我发现了这个链接: https://www.baeldung.com/java-jpa-join-vs-primarykeyjoin

我不知道性能方面是否更好。

© www.soinside.com 2019 - 2024. All rights reserved.