Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate中的一对一关系_Java_Hibernate_Relationship_One To One - Fatal编程技术网

Java hibernate中的一对一关系

Java hibernate中的一对一关系,java,hibernate,relationship,one-to-one,Java,Hibernate,Relationship,One To One,我在hibernate中实现一对一(一个员工一个手机)关系,如下所示。此代码工作正常,但由于这是一对一关系,将相同的移动电话号码分配给emp1和emp2应该会产生问题(这违反了关系),但代码正在接受并添加具有相同移动电话的2个EMP(从数据库表中确认)。为什么hibernates的一对一关系就像一个MobileMay员工一样? 我的代码: @实体 数据库显示具有相同移动号码的两个EMP记录(违反1-1)对于一对一关系,您应该始终确保对数据库有唯一的约束(由hibernate生成或手动创建) Hi

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


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

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

Hibernate不会检查它,因为每次检查都需要收集额外的数据。数据库可以更有效地完成这项工作。 要进行检查,hibernate必须进行额外的查询。如果数据库配置正确,额外的查询将花费时间和资源,而不会带来任何收益

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

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

Hibernate不会检查它,因为每次检查都需要收集额外的数据。数据库可以更有效地完成这项工作。 要进行检查,hibernate必须进行额外的查询。如果数据库配置正确,额外的查询将花费时间和资源,而不会带来任何收益

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

是否使用hibernate属性
hibernate.hbm2ddl.auto
生成表?hibernate在负责创建表时会自动添加unicity约束,否则您必须手动添加。可能重复的“是”与注释链接中的问题类似。抱歉,您是否使用hibernate属性
hibernate.hbm2ddl.auto
生成表?hibernate在负责创建表时会自动添加unicity约束,否则您必须手动添加。可能重复的“是”与注释链接中的问题类似。抱歉,谢谢Stefan的解释。因此,请告诉我我是否正确理解了它——“Hibernates不负责处理一对一/多,它应该通过模型对象关系,它只是提供给hibernate的一个输入,以便它可以想当然地考虑某些事情并优化其实现”。在给你一个好的解释之前,我也试着做了如下的解释。很抱歉之前的评论不完整。-使用@OneTONE注释将员工引用添加到移动端,使其双向。导致两个表彼此都有外键。不过,将emp1、emp2分配给同一个移动设备(尽管忽略了hib是错误的实现)可能会弄乱代码。hibernates负责将对象模型正确映射到数据库方案。数据库中数据的一致性是另一回事。使关系具有双向性意味着您也可以在另一侧使用OneTONE定义关系,但在注释中指定MappedBy字段。这样,它就不需要额外的db字段,数据库中仍然只有一个外键。如果没有MappedBy,它将不是一个双向关系,而是两个单向关系,而且你自己将有更多的工作来保持这些一致性。是的,无论你做什么,除非您自己使用关系的另一个方向进行检查,或者您定义了一个唯一的约束,否则将同一个手机分配给两名员工总是会把事情搞砸。但是唯一的约束总是更有效的。谢谢Stefan的解释。因此,请告诉我我是否正确理解了它——“Hibernates不负责处理一对一/多,它应该通过模型对象关系,它只是提供给hibernate的一个输入,以便它可以想当然地考虑某些事情并优化其实现”。在给你一个好的解释之前,我也试着做了如下的解释。很抱歉之前的评论不完整。-使用@OneTONE注释将员工引用添加到移动端,使其双向。导致两个表彼此都有外键。不过,将emp1、emp2分配给同一个移动设备(尽管忽略了hib是错误的实现)可能会弄乱代码。hibernates负责将对象模型正确映射到数据库方案。数据库中数据的一致性是另一回事。使关系具有双向性意味着您也可以在另一侧使用OneTONE定义关系,但在注释中指定MappedBy字段。这样,它就不需要额外的db字段,数据库中仍然只有一个外键。如果没有MappedBy,它将不是一个双向关系,而是两个单向关系,你甚至会有更多的工作要做
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();
}