一对一的双向关联会导致OutOfMemory错误吗?

时间:2016-03-01 17:30:18

标签: java hibernate

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

那么,为什么一对一的双向关系实际上是安全的呢?

1 个答案:

答案 0 :(得分:1)

这与Hibernate无关。如果你有两个对象实例并且它们相互引用,但是它们都不能从应用程序中的其他对象访问,那么垃圾收集器足够聪明,可以消除它们。

Session关闭(或清除)时,Hibernate将不再引用实体实例(它们变得分离)并且如果您的应用程序代码的其余部分没有引用它们,它们将被垃圾收集