如何在hbm中做多列UniqueConstraint?

Posted

技术标签:

【中文标题】如何在hbm中做多列UniqueConstraint?【英文标题】:How to do multiple column UniqueConstraint in hbm? 【发布时间】: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;

【问题讨论】:

【参考方案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 列创建。

【讨论】:

以上是关于如何在hbm中做多列UniqueConstraint?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 hbm 文件中使用 fetch="join"?

如何根据实体类生成对应的.hbm.xml文件?

myeclipse.hbm.xml如何自动生成

hibernate.cfg.xml 中如何设置 hbm.xml 和 Annotations 的 mapping

hibernate.hbm2ddl.auto Hibernate 如何决定何时创建或更新 ddl?

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python