【问题标题】:one-to-one mapping using unique constraint not working as expected使用唯一约束的一对一映射未按预期工作
【发布时间】:2011-04-12 14:43:29
【问题描述】:

我正在尝试这种简单的单向一对一关系

人---->地址

使用具有唯一约束的多对一映射。

这就是我的映射在 Person.hbm.xml 中的样子:

<class name="Person" table="PERSON">
<many-to-one name="address" column="ADDRESS_ID" cascade="all" not-null="true" unique="true"/>

我认为这应该只允许每个人有一个唯一的地址 - 没有两个人可以共享一个共同的地址。

所以,下面的代码应该会失败。但是在这段代码中,Hibernate 允许两个 Johns 保持在同一个地址。

    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    Address address = new Address("Bond Street", "London", 121212);
    Person person1 = new Person("John Doe", address);
    Person person2 = new Person("John McClane", address);
    session.save(person1);
    session.save(person2);
    transaction.commit();
    session.close();

请让我知道我在这里缺少什么?

【问题讨论】:

  • 您是否在数据库架构中添加了唯一约束?
  • No.. :-0 但想知道如果 Hibernate 的 unique="true" 依赖于模式约束本身,它在哪里有帮助?那么 unique="true" 只是一个标记吗?

标签: java hibernate


【解决方案1】:

阅读http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e7576,并在第 5.1.7.1 段中找到多对一的描述。它说:

唯一(可选):启用 DDL 为 外键列。通过允许 这是一个目标 property-ref,你可以使 关联多重性一对一。

这意味着它被 Hibernate 的数据库模式生成工具用来添加唯一约束。如果你不使用它,那么你必须自己添加这个约束。

【讨论】:

  • 啊谢谢!!如果我们不使用hibernate为我们创建DDL,我们应该自己添加约束..明白了..(我认为not-null属性也相关但略有不同,因为它也会进行运行时检查)
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多