これらのようないくつかのテーブルでレガシーデータベースをマップする必要があります
---------
- 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=?
ご覧のとおり、2 番目のエンティティの ID が複数回取得されます。これにより、私のマッピングは最適ではないと思われます。
ORM として Hibernate 4.3.10 を使用しています。
複数の列の取得を避けるために @JoinColumns を修正する方法はありますか?