一对一的双向关系

一对一的双向关系

休眠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将不再引用实体实例(它们已分离),并且如果其余的应用程序代码也未引用它们,则它们将被垃圾回收。

10-01 18:36