1

我正在将专有数据库映射到 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)
);

如您所见,这表明可以有多个 AB 关系将它们放在不同的组中。我想结束,实体 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 中创建多个集合?

干杯

尼克

4

3 回答 3

3

据我所知,Hibernate 不能以您想要的方式使用这样的“鉴别器”列。Hibernate 需要为它们中的每一个提供一个连接表。

也许您可以在表格上定义其他视图,显示每个分组?

于 2009-11-19T09:35:02.103 回答
3

如果您正在考虑这样做,请不要这样做。如今,随着经济的发展,桌子很便宜,所以只需为每个协会创建一张;它会容易得多。

如果您受旧数据库的约束并且无法更改该表的结构,我会

  1. 首先考虑 skaffman 的解决方案(+1,顺便说一句)。根据您的目标数据库,您可能能够为您的视图编写一个触发器,该触发器将插入足够的“鉴别器”值。

  2. 如果在您的数据库中无法实现上述操作,另一种解决方案是使用自定义 SQL 对您的集合进行 CRUD 操作。请记住,对于涉及您的关联作为条件的一部分的复杂 HQL 查询,这将不起作用(例如,您的“鉴别器值”不会被应用)。您还可以将其与上述混合/匹配 - 例如使用视图并使用自定义 SQL 进行插入/删除。

  3. 如果上述两种方法都失败,请按照 framer8 的建议使用“关联作为一个单独的实体”。由于复合键和所有无关代码,这将是相当难看的(因为我们在这里假设您不能更改表)。事实上,如果您的任何关联允许重复,这可能是不可能的。

于 2009-11-19T16:58:43.960 回答
0

我认为任何时候需要访问链接表中的字段的建议是使链接表成为一个对象和一个独立的休眠实体。A 将有一组 AtoB 对象,而 AtoB 将有一组 B 对象。我有一个类似的情况,链接表有一个与链接关联的用户。

select joinTable.b from A a 
left join a.AtoB joinTable
where joinTable.group = 'C'

它不像休眠完成的隐式连接那样优雅,但它确实为您提供了所需的控制。

于 2009-11-19T15:08:04.510 回答