【问题标题】:Unique Constraint for Set<String> with Hibernate具有 Hibernate 的 Set<String> 的唯一约束
【发布时间】:2012-10-18 20:28:15
【问题描述】:

我有一个包含如下集合的实体:

@ElementCollection
Set<String> branches;

现在 Hibernate 所做的是创建一个表 project_branches(project_id | 分支)并在 branches 上添加一个唯一约束。有没有办法告诉hibernate唯一约束应该同时涉及project_id branches

我找不到这个问题的答案,虽然我认为我不是第一个遇到这个问题的人......谢谢

【问题讨论】:

  • 什么?您能否显示为project_branches 表生成的 sql。并解释你想要达到的目标。
  • 好的,我有一个实体“存储库”。现在每个存储库都有分支。但是使用上面的代码,Hibernate 将不允许我为 id 为“1”的存储库创建分支“master”,为 id 为“2”的存储库创建另一个分支“master”。但是我需要的关于分支的唯一信息是它的名称,所以我不想为它创建一个单独的实体。我希望这更清楚
  • 那么,您是否想要唯一约束?如果你这样做了,那么它应该在哪里?
  • 是的,我确实想要对 project_id 分支的唯一约束。

标签: java hibernate


【解决方案1】:

这取决于映射中涉及的列。

还有另一种配置。请考虑在实体级别添加UniqueConstraint 注释,例如下面:

  @Table(name="project_branches",
    uniqueConstraints = {@UniqueConstraint(columnNames={"project_id", "branches"})}
  )

编辑:尝试使用@CollectionTable 注释。

 @ElementCollection
 @CollectionTable(
    name="project_branches",
    joinColumns=@JoinColumn(name="branches"),
    uniqueConstraints = {@UniqueConstraint(columnNames={"project_id", "branches"})}
  )
  Set<String> branches;

【讨论】:

  • 好的,您不能将@Table 注释添加到属性中,如您所见,我不想为此创建新实体,除非我真的必须这样做。
  • @entek:我没有要求在属性级别添加。我已经提到“考虑在 entity level 添加一个 UniqueConstraint 注释”
  • 是的,但是因为没有Branch实体,所以没有实体级别。这就是问题所在。
  • project_branches table 可以映射为实体,NO?
  • 我的目标是在不为其创建实体的情况下映射这组字符串。因为它实际上只是字符串的集合。问题只是唯一的约束。我只是想知道是否可以改变这种行为。
【解决方案2】:

好的,我找到了解决方案:实体字段支持注释@CollectionTable,所以我能够像这样解决它:

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "project_branches", uniqueConstraints = @UniqueConstraint(columnNames = {
        "project_id", "branches" }))
Set<String> branches = new HashSet<String>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多