使用joinColumn进行单向一对多映射

时间:2012-09-12 08:51:21

标签: hibernate nhibernate-mapping

根据hibernate文档,hibernatenate团队强烈建议在没有连接表的情况下不使用一对多的单向映射。我想知道这是因为性能问题还是其他任何原因。

假设有一个员工可以拥有多个电话号码,那么我将拥有这个映射

@Entity
public class Employee { 
...
 @OneToMany
 @JoinColumn(name="employee_fk")
 public List<Phone> phones;
 ...
 }

@Entity
public class Phone { 
...
}

Hibernate将生成带有外键的电话表,所以我在这里看不到任何问题。此外,我不希望电话类具有员工财产。 Hibernate团队建议在这种情况下使用连接表,但为什么我不必要地创建一个表?

2 个答案:

答案 0 :(得分:2)

这更像是设计问题,而不是性能问题。如果您认为电话不了解其所分配的员工,则表示电话实体与员工实体无关。如果它与Employee实体无关,则其表不应具有Employee表的外键。

此外,由于电话不了解其员工,这意味着它可能会被重复使用并与其他类型的实体相关联:公司,客户等。拥有所有的外键是有问题的。可以在电话表中拥有电话的实体。

答案 1 :(得分:2)

在单向映射的情况下,hibernate将击中DB两次,

对于同一名员工John的新手机,它会做这样的事情

在phn no table

中插入新手机号码

使用此phn no table

中的phn no更新员工ID(john)

您还需要映射手机持久性等级并向特定员工注册,否则您的手机课程将被重复使用,我想您不想这样做。