休眠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
。那么,为什么一对一的双向关系实际上是安全的呢?
最佳答案
这与休眠无关。如果您有两个对象实例并且它们互相引用,但是应用程序中的其他对象都无法访问它们,那么垃圾收集器足够聪明,可以消除这两个对象。
当Session
关闭(或清除)时,Hibernate将不再引用实体实例(它们已分离),并且如果其余的应用程序代码也未引用它们,则它们将被垃圾回收。