5

所以我昨天问过这个问题,但我们的目标职位变了,问题是不同的:休眠/ JPA多对多的关系,通过一个连接表和复合键,唯一约束问题

Hibernate/JPA Collection of Elements with Many to Many relationship?

我想知道是否有可能创建将建模我所需关系的实体,以便在启动我的应用程序时Hibernate将创建我的模式。

我想要的关系是这样的:

1 http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash4/417593_10150594114269218_505554217_8657377_1475865815_n.jpg

的事情是,在加入表实际上可以包含不链接到任何元素行。该结构表示根据“类型”和“值”对对元素进行分类,并输入到此特定应用程序之外的系统中。

我希望能够做的是通过映射将元素Hibernate实体设置为包含类别列表,以便我可以实际查看我的元素属于哪个类别,以便hibernate创建表我。

这里是我到目前为止有:

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = { 
     @JoinColumn(name = "type", referencedColumnName = "type"), 
     @JoinColumn(name = "value", referencedColumnName = "value") }) 
@Column(name = "category") 
public List<ElementCategory> getCategories() { 
    return categories; 
} 

但这大部分我想要的东西,它会创建如我上面的表中,究竟如何,我希望他们:在我的元素中的实体类这样的映射此有一点,有一个唯一约束添加到(类型,值)对的元素表中。我不希望这样做,因为多个元素可以具有相同的类型和值对,我需要能够停止开始创建唯一约束,但无法弄清楚如何使用当前映射,我可以这样做吗?我是否错过了多对多的关系?

+0

我仍然认为你需要一个inverseJoinColumn来在你的连接表中包含ElementCategory的id。 – bvanvelsen 2012-02-10 13:04:50

+0

难道这听起来更合乎逻辑,类型和价值是一个实体?所以这个类型的值实体是一个连接表的连接列。 – bvanvelsen 2012-02-10 13:11:30

+0

这个ID暗含在我有一组元素类别的事实中,就像任何Set一样。正如我所说的,表格的设置是正确的,并且包括连接表中的“类别”和ElementCategory表格中的“id”之间的链接。 您是否认为反向连接会从元素表中移除唯一约束?我会试试看。 – Link19 2012-02-10 13:12:06

回答

1

Hibernate在类型和值列上放置了一个唯一的约束似乎很合乎逻辑。

您在@ManyToMany映射中说,在连接表中,连接列是类型和值列。所以基本上你说hibernate应该通过value和type属性来确定哪个元素与ElementCategory耦合。因此这两个属性的组合应该是唯一的。否则hibernate将不知道哪个元素属于哪个元素类型

如果您希望多个Element实体可以耦合到多个ElementType实体,并且类型和值的组合不总是唯一的,那么您不能使用这些属性作为joincolumns

+0

但是那么将没有办法让Element类包含类别列表?这只是运气不好,因为它需要更好的设计? – Link19 2012-02-13 08:51:49

+0

它可以包含类别列表,但不基于类型和值,如果这两个值对于每个元素不是唯一的 – bvanvelsen 2012-02-13 08:55:48

+0

确切地说,但在我的模型类别中是基于类型和值的组合以及多个元素可以有同一对,所以我不可能让休眠来管理它?我可以做的最好的是在我的服务中实现一些功能,分别处理类别并使列表暂态。 – Link19 2012-02-13 11:23:53