Hibernate 5
我不明白Hibernate如何管理好事情,我的问题可能看起来很愚蠢。考虑以下simepl一对一双向关系:
@Entity
@Table(name = "player")
public class Player
@OneToOne(mappedBy = "player", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private PlayerPoints points;
//other columns GET, SET
}
@Entity
@Table(name = "player_points")
public class PlayerPoints {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@OneToOne(targetEntity = Player.class)
@JoinColumn(name = "player_id")
private Player player;
//Other columns, get set
}
那么,如果我们通过条件API查询以下Player
集合,该怎么办?
SessionFactory sessionFactory;
//...
Criteria criteria = sessionFactory.getCurrentSession().creaetCriteria(Player.class);
List<Player> players = criteria.list();
由于列表Player
中的任何players
都维护了对PlayerPoints
的引用,并且每个PlayerPoints
都保留了对Player
的引用,我猜他们是'从未被GC破坏(引用计数永远不会变为零)。
我认为这可能会导致OutOfMemoryError
。
那么,为什么一对一的双向关系实际上是安全的呢?
答案 0 :(得分:1)
这与Hibernate无关。如果你有两个对象实例并且它们相互引用,但是它们都不能从应用程序中的其他对象访问,那么垃圾收集器足够聪明,可以消除它们。
当Session
关闭(或清除)时,Hibernate将不再引用实体实例(它们变得分离)并且如果您的应用程序代码的其余部分没有引用它们,它们将被垃圾收集