java - hibernate 中的一对一关系

标签 java hibernate relationship one-to-one

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

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 生成或手动创建)。

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

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

关于java - hibernate 中的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45160898/

相关文章:

java - 如何更改 AlertDialog 中的蓝线(全息主题)

java - 使用 Hibernate 从 Postgres 枚举到 Java

swift - 使用核心数据进行本地化

objective-c - 如何在不重复的情况下插入与另一个相关的核心数据记录

java - 如何从 spring-dispatcher-servlet.xml 访问 SessionFactory 到 DAO

MySQL - 如何插入具有多对多关系的表

java - Project Euler 5,我得到的答案只有一半,为什么?

java - Scala 和 Eclipse : Export as Jar File, 但找不到 main 方法

java - 在 Kotlin 的对象字段中具有上下文的 Android 类

Hibernate 和三个表发生 java.lang.StackOverflowError