gpt4 book ai didi

java - 一对一的双向关系会导致 OutOfMemory 错误吗?

转载 作者:行者123 更新时间:2023-12-01 10:19:11 25 4
gpt4 key购买 nike

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();

由于列表 players 中的任何 Player 都维护对 PlayerPoints 的引用,并且每个 PlayerPoints 都维护一个引用对于 Player 我猜测它们永远不会被 GC 销毁(引用计数永远不会为零)。

我认为这可能会导致OutOfMemoryError

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

最佳答案

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

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

关于java - 一对一的双向关系会导致 OutOfMemory 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35729476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com