【问题标题】:Hibernate / JPA many to many relationship through a join table and a composite key, Unique Constraint issueHibernate / JPA 通过连接表和复合键建立多对多关系,唯一约束问题
【发布时间】:2012-03-02 22:27:13
【问题描述】:

所以我昨天问了这个问题,但是目标帖子变了,问题也不一样了:

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

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

我希望能够通过映射将我的 Element Hibernate Entity 设置为包含类别列表,这样我就可以实际看到我的元素属于哪些类别,并且 hibernate 为我创建表.

这是我到目前为止所得到的:在我的 Element Entity 类中映射它,如下所示:

@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;
}

这完成了我想要的大部分工作,它创建了我的表格,就像我希望他们禁止一件事一样,在 (type,value) 对的元素表中添加了一个唯一约束。我不希望这样,因为多个元素可以具有相同的类型和值对,我需要能够从开始创建时停止唯一约束,但无法弄清楚当前映射如何,我可以这样做吗?我错过了多对多关系的要点吗?

【问题讨论】:

  • 我仍然认为您需要一个 inverseJoinColumn 来将 ElementCategory 的 id 包含在您的联接表中。
  • 类型和值是一个实体听起来更合乎逻辑吗?所以这个类型的id,值实体是joinable的joincolumn
  • ID 隐含在我有一组元素类别这一事实中,就像任何集合一样。正如我所说,表的设置正确,其中包括连接表中的“类别”和 ElementCategory 表中的“id”之间的链接。你认为反向连接会从元素表中删除唯一约束吗?我试试看。
  • 我只是在大声思考:)
  • 另外你是对的,将类型和值对建模为实体更合乎逻辑,但我无法更改元素表,因为我无法控制访问它的前端。

标签: java hibernate many-to-many composite-key unique-constraint


【解决方案1】:

Hibernate 对类型和值列设置唯一约束实际上看起来很合乎逻辑。

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

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

【讨论】:

  • 但是没有办法让 Element 类包含一个类别列表?这只是运气不好,因为它需要更好的设计吗?
  • 它可以包含类别列表,但如果这两个值对于每个元素不是唯一的,则不基于类型和值
  • 没错,但是在我的模型中,类别是基于类型和值的组合,并且多个元素可以有相同的对,所以我不可能让 hibernate 管理这个?我能做的最好的就是在我的服务中实现一些功能,分别处理类别并使列表瞬态。
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2021-02-03
  • 2018-06-29
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多