2017-07-18 64 views
1

我在hibernate中执行一对一(一个员工<-> one Mobile)关系,如下所示。这段代码工作正常,但由于这是一对一的关系,因此将相同的手机号码分配给emp1和emp2应该产生了问题(它违反了关系),但代码正在接受并在同一移动设备上添加2个emp(从数据库表中确认)。为什么冬眠一对一的关系就像一个手机< - >很多员工? 我的代码: @Entity冬眠中的一对一关系

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违例)

+0

你使用hibernate属性'hibernate.hbm2ddl.auto'来生成你的表吗?当hibernate负责创建表时,它会自动添加唯一性约束,否则你必须手动添加它。 –

+0

可能的重复https://stackoverflow.com/questions/8968294/why-onetoone-is-allowing-duplicate-associations –

+0

是的,这与评论链接中的问题类似。道歉重复 –

回答

0

一对一的关系,你应该始终确保你有一个独特的对数据库的约束(由休眠或手动创建)。

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

如果您没有唯一的约束,并且您定义了双向关系,则可能会遇到更多麻烦。 Hibernate将保存冲突记录,而不会像您已经发现的那样抱怨。对于hibernate来说,使用从另一方的对象开始的关系是不可能的(通过你的情况通过Mobile获得Employee)。如果将移动设备配置为热切地获得其相关员工,那么在员工将其保存在哪里之后,移动设备就不可能在内存中获得。

+0

感谢Stefan解释得很好。所以请告诉我,我是否正确地理解了它 - “它不是一种多/多对一的休眠的责任,它应该是通过模型对象关系,并且它只是一个提供给休眠的输入,以便它可以采取某些措施授予并优化其实施“。在得到你很好的解释之前,我也尝试了下面。 –

+0

对于之前未完成的评论感到抱歉。 - 通过@OneToOne注释添加了对Mobile端的Employee引用,使其成为双向的。导致两个表都与其他外键相关联。仍然可以通过将emp1,emp2分配给同一个移动设备(尽管它忽略了错误的实现hib)来搞乱代码。 –

+0

将你的对象模型正确映射到数据库方案是冬眠责任。数据库中数据的一致性是另一回事。 –