如何在hbm中实现多列唯一约束?

27

我正在处理一些遗留的hibernate代码。

如何使用hbm.xml(hibernate映射文件)替代注释实现以下功能?

@Table(name="users", uniqueConstraints = {
    @UniqueConstraint(columnNames={"username", "client"}),
    @UniqueConstraint(columnNames={"email", "client"})
})
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private int id;
    private String username;
    private String email;
    private Client client;
}
3个回答

22
使用properties标签:
...
<properties name="uk1" unique="true">
        <property name="username" .../>
        <many-to-one name="client" .../>
</properties>

<properties name="uk2" unique="true">
        <property name="email" .../>
        <many-to-one name="client" update="false" insert="false" .../>
</properties>
...

文档摘录:

<properties>元素允许定义一个类的属性的命名逻辑分组。这个结构最重要的用途是允许将多个属性组合成为属性引用的目标。同时,它也是定义多列唯一约束的便捷方式。

所有可用选项都在Hibernate文档中描述。


嗨,我知道文档上是这么说的,但对我来说并没有起作用。解决方案是将 unique 放在 column 标签内而不是 property 标签内:<property name="login" type="string"> <column length="45" name="Login" unique="true"/> </property> - Hassen Ch.
1
我不知道为什么属性标签对你没有起作用(Hibernate 版本?),但是你的定义将无法建模多列唯一约束。 - Thierry
这是Hibernate 3,而我提供的解决方案正好达到了我想要的效果! - Hassen Ch.
@soufrk:我不这么认为。这应该是Hibernate核心功能。 - Thierry
不好意思,我不知道。hbm.xml配置格式已经过时很长时间了。而且我猜你不想在测试环境中有可预测的约束名称,而是更像生产环境。在这种情况下,不建议使用Hibernate迁移工具。相反,可以看一下liquid-base / flyway,以更好地处理生产数据的迁移。 - Thierry
显示剩余2条评论

9
您也可以这样做:
  <many-to-one name="client" unique-key="uk1,uk2" .../>
  <property name="username" unique-key="uk1"  .../>
  <property name="email" unique-key="uk2"  .../>

您不需要在hbm中使用 标签。 如果您只想要多个唯一约束。

请先查看此链接 如何回答问题这个问题之前已经有人回答过了,显然你可以在此处添加你的答案。但是在回答之前需要理解一些要点。首先,不要添加与先前添加的相同代码或建议的答案。其次,如果用户非常明确地询问了问题及其解决方法,请不要添加过于复杂的答案。第三,如果您想就答案或问题提出任何建议,可以添加评论。 - always-a-learner
2
@ankitsuthar,我对你的评论并不完全确定。首先,他添加了一个不同的答案,并提出了不同的建议(至少在这个特定的问题线程中,我找不到类似的答案)。其次,他实际上为“hbm中的多列唯一约束”问题提供了更简单和具体的答案。第三,由于这是另一种答案,我认为它不应该是一个评论。 - ameenhere
1
这个答案对我非常有效,我无法使用上面的接受答案指定“约束名称”。但是使用这个答案,我得到了在“unique-key”标签中指定的约束名。 - ameenhere

3

您可以将相同的唯一键属性添加到两个不同的列中。这将创建组合唯一键。

原始答案:最初的回答

<property name="firstName" column="first_name" unique-key="name" />
<property name="lastName" column="last_name" unique-key="name" />

在上面的例子中,唯一键将由名字和姓氏两列创建。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接