我正在将专有数据库映射到Hibernate以与Spring一起使用。在其中,有几个连接表,对于实体A和实体B,具有以下模式:
CREATE TABLE AjoinB (
idA int not null,
idB int not null,
groupEnum enum ('groupC', 'groupD', 'groupE'),
primary key(idA, idB, groupEnum)
);
正如您所看到的,这表明可以有多个A-B关系将它们放在不同的组中。我想最终得到实体A的第一行和实体B的第二行,以下是
Set<B> BforGroupC, BforGroupD, BforGroupE;
Set<A> AforGroupC, AforGroupD, AforGroupE;
到目前为止,我只设法将它们放在一个集合中而忽略了groupEnum关系属性:
@ManyToMany(targetEntity=B.class, cascade={ CascadeType.PERSIST, CascadeType.MERGE } )
@JoinTable(name="AjoinB", joinColumns=@JoinColumn(name="idA"), inverseJoinColumns=@JoinColumn(name="idB") )
private Set<B> BforAllGroups;
和
@ManyToMany( mappedBy = "BforAllGroups", targetEntity = A.class )
private Set<A> AforAllGroups;
如何在groupC,groupD或groupE中创建多个集合?
干杯
的Nik
答案 0 :(得分:3)
据我所知,Hibernate不能以你想要的方式使用这样的“鉴别器”列。 Hibernate需要为每个人提供一个连接表。
也许您可以在桌面上定义其他视图,显示每个分组?
答案 1 :(得分:3)
如果您正在考虑这样做,请不要。现在的桌子很便宜经济和所有,所以只需要创建一个协会;它会变得如此简单。
如果您受旧版数据库的约束而无法更改该表的结构,那么
首先考虑skaffman的解决方案(+1,顺便说一句)。根据您的目标数据库,您可以为您的视图编写一个触发器,以便插入足够的“鉴别器”值。
如果您的数据库中无法实现上述目标,则另一种解决方案是将custom SQL for CRUD operations用于您的收藏。请记住,对于涉及您的关联作为条件的一部分的复杂HQL查询,这将 NOT 工作(例如,您的“鉴别器值”将不会被应用)。你也可以将它与上面的混合/匹配 - 例如使用视图并使用自定义SQL进行插入/删除。
如果上述两种方法均失败,请按照framer8的建议选择“关联作为单独的实体”。由于复合键和所有无关的代码,这将是相当丑陋的(因为我们假设你不能改变你的表)。事实上,如果你的任何关联允许重复,它可能是不可能的。
答案 2 :(得分:0)
我认为,当你需要访问链接表中的字段时,建议就是使链接表本身成为一个对象和一个休眠实体。 A将具有一组AtoB对象,AtoB将具有一组B对象。我有一个类似的情况,其中链接表有一个与链接相关联的用户。
select joinTable.b from A a
left join a.AtoB joinTable
where joinTable.group = 'C'
它并不像hibernate完成隐式连接那样优雅,但它确实为您提供了所需的控件。