【问题标题】:How to do multiple column UniqueConstraint in hbm?如何在hbm中做多列UniqueConstraint?
【发布时间】:2011-02-14 00:39:17
【问题描述】:

处理一些遗留的休眠代码。

如何使用 hbm.xml(休眠映射文件)而不是注释来执行以下操作?

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

【问题讨论】:

    标签: hibernate persistence constraints unique-constraint hibernate-mapping


    【解决方案1】:

    使用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>
    ...
    

    文档摘录:

    元素允许定义一个命名的, 类属性的逻辑分组。最重要的用途 该构造的最大特点是它允许将属性组合为 属性引用的目标。这也是一种方便的方式来定义 多列唯一约束。

    Hibernate documentation 中描述了所有可用选项。

    【讨论】:

    • 嗨,我知道文档是这么说的,但这对我不起作用。解决方案是将unique 放入column 标签而不是property 标签&lt;property name="login" type="string"&gt; &lt;column length="45" name="Login" unique="true"/&gt; &lt;/property&gt;
    • 我不知道为什么属性标签对您不起作用(休眠版本?),但您的定义将无法为多列唯一约束建模。
    • 它是 Hibernate 3,我提供的解决方案正如我所愿!
    • 我们还需要 hibernate-validator 吗??
    • @soufrk :我不这么认为。应该是hibernate的核心功能
    【解决方案2】:

    你也可以这样做:

      <many-to-one name="client" unique-key="uk1,uk2" .../>
      <property name="username" unique-key="uk1"  .../>
      <property name="email" unique-key="uk2"  .../>
    

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

    【讨论】:

    • 请先看这个how-to-answer这个问题之前回答过,显然,你可以在这里添加你的答案。但是在回答之前,您需要了解一些要点。首先,不要添加以前使用相同代码或建议添加的答案。其次,如果用户已经非常具体地询问了问题以及他需要解决什么问题,请不要添加过于复杂的答案。第三,如果您想对答案或问题提出任何建议,可以添加评论。
    • @ankitsuthar 我不完全确定您的评论。首先,他用不同的建议添加了不同的答案(至少我在这个特定的问题线程中找不到类似的答案)。其次,他实际上为“hbm 中的多列唯一约束”问题提供了一个更简单、更具体的答案。第三,由于这是一个替代答案,我认为它不应该是评论。
    • 这个答案对我来说非常有效,我无法使用上面接受的答案指定“约束名称”。但是使用这个答案,我得到了“唯一键”标签中指定的约束名称。
    【解决方案3】:

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

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

    在上面的示例中,唯一键将从 first_name 和 last_name 列创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 2022-07-07
      • 2016-02-01
      相关资源
      最近更新 更多