【问题标题】:One to one relationship in hibernate休眠中的一对一关系
【发布时间】:2017-07-18 08:05:01
【问题描述】:

我在休眠中实现一对一(一个员工一个移动)关系如下。此代码工作正常,但由于这是一对一的关系,将相同的手机号码分配给 emp1 和 emp2 应该会产生问题(它违反了关系),但代码正在接受并添加 2 个具有相同手机的 emp(从数据库表确认)。为什么hibernates一对一的关系就像一部手机许多员工? 我的代码: @实体

public class Employee {
    @Id  @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    @OneToOne
    private Mobile mobile;
    //...rest of the code
}
@Entity
public class Mobile {
    @Id @GeneratedValue
    private int id;
    private long number;
    //...rest of the code
}
Test Client main(...){
    Mobile mobile = new Mobile(9999999999L);
    Employee emp1 = new Employee("Raja");
    Employee emp2 = new Employee("Raja");
    emp1.setMobile(mobile);
    emp2.setMobile(mobile);// VIOLATING 1-1 RELATIONSHIP
    //...REST OF THE COMMON CODE
    session.save(mobile);
    session.save(emp1);
    session.save(emp2);
    session.getTransaction().commit();
}

数据库显示两个 EMP 记录具有相同的手机号码(违反 1-1)

【问题讨论】:

  • 您是否使用休眠属性hibernate.hbm2ddl.auto 来生成您的表格?当 hibernate 负责创建表时,它会自动添加唯一性约束,否则您必须手动添加它。
  • 是的,这类似于评论链接中的问题。重复道歉

标签: java hibernate relationship one-to-one


【解决方案1】:

对于一对一的关系,您应该始终确保您的数据库具有唯一约束(由 hibernate 生成或手动创建)。

Hibernate 不会检查它,因为它每次都需要收集额外的数据来进行检查。数据库可以更有效地做到这一点。 要进行检查,hibernate 将不得不做一个额外的查询。如果数据库配置正确,那么额外的查询将花费时间和资源而没有任何收益。

如果您没有唯一约束并且定义了双向关系,则可能会遇到更多麻烦。 Hibernate 将保存冲突的记录,而不会像您已经发现的那样抱怨。并且休眠将无法使用从另一侧的对象开始的关系(在您的情况下通过手机获取员工)。如果将移动设备配置为急切地获取其相关员工,那么在保存两个员工的位置后,将无法将移动设备获取到内存中。

【讨论】:

  • 感谢 Stefan 解释得很好。所以告诉我我是否理解正确 - “它不是 Hibernates 负责处理一对一/多,它应该通过模型对象关系,它只是提供给休眠的输入,以便它可以采取某些事情授予并优化其实施”。在得到你很好的解释之前,我也尝试过。
  • 抱歉之前的评论不完整。 - 使用@OneToOne 注释添加了对移动端的员工引用,以使其双向。导致两个表都有彼此的外键。仍然可以通过将 emp1、emp2 分配给同一移动设备来弄乱代码(尽管忽略了错误的实现 hib)
  • 将对象模型正确映射到数据库方案是休眠的责任。数据库中数据的一致性是另一回事。
  • 使关系双向意味着您也使用 OneToOne 定义另一侧的关系,但在注释上指定了 MappedBy 字段。这样它就不需要额外的 db 字段,并且您的数据库中仍然只有一个外键。如果没有 MappedBy,它将不是双向关系,而是 2 个单向关系,您甚至需要自己做更多的工作来保持这些关系的一致性。
  • 是的,不管你做什么,你总是可以通过将同一个手机分配给 2 名员工来搞砸,除非你自己使用关系的另一个方向检查它或者你定义一个唯一的约束。但唯一约束总是更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多