Hibernate:哪一个更好的方法:在多个到一个关联中保存源或目标

时间:2014-07-16 14:03:39

标签: java hibernate jpa orm one-to-many

@Entity
public class Troop {
@OneToMany(mappedBy="troop")
public Set<Soldier> getSoldiers() {
...
}

@Entity
public class Soldier {
@ManyToOne
@JoinColumn(name="troop_fk")
public Troop getTroop() {
...
}

我这样做:

Troup t = new Troup();
t.getSoldiers().add(soldier);

这也节省了部队和士兵。由于士兵是所有者,因此也添加了外键。但哪一个更好的方式,我的意思是保存toop或士兵使用:

Troop t = .....     // Get troop from session
Soldier s = new Soldier();
s.setTroop(t);

2 个答案:

答案 0 :(得分:1)

两种方法都会得出相同的结果。但是,我认为保存单个Soldier实体的效率会更高一些:

  • 持久性提供程序不需要遍历集合
  • 代码更好地对应于DB中发生的事情 - 只有Soldier表无论如何都会更新。

但是,也许您应该考虑哪种业务概念更合适,这意味着您是否在应用程序中使用个人SoldiersTroops

  • Soldier添加到Troop
  • Troop分配给Soldier

差异可能很微妙,但根据您的业务案例,任何一个可能是更易读和易于理解的解决方案。

答案 1 :(得分:1)

因为您有双向关联,所以强制设置此关联的两面。你不应该只设置一方,而另一方则处于不一致的状态。

如果要将其更改为单向关联,则@ManyToOne方面的管理效率更高:

Troop t = .....  
Soldier s = new Soldier();
s.setTroop(t);

使用@OneToMany方将要求您在添加新元素之前获取Set。这是强制性的,因为Set不允许重复,因此需要初始化集合以强制执行唯一性策略。

总而言之:

  1. 对于双向关联,您应该设置双方。只设置一侧可能会导致非常微妙的错误。

  2. @ManyToOne单向关联比@OneToMany单向关联更好。