setter 和 LazyLoad 会话问题

Issue with setter and LazyLoad Session

前言,我对使用 Spring 完全陌生,但一直在使用它,并且在使用过程中逐渐弄清楚了。我正在使用 Java 基本 Spring。

我有一个问题,我有一个对象,除了代表游戏玩家的多对一关系之外,还包含许多东西。这是一个列表。

使用我们的控制器进行测试发现此列表的 setter 存在问题,具体而言:

org.springframework.orm.jpa.JpaSystemException: Exception occurred inside setter of com.pokerface.pokerapi.game.GameState.players; nested exception is org.hibernate.PropertyAccessException: Exception occurred inside setter of com.pokerface.pokerapi.game.GameState.players


public void setPlayers(List<Player> players) {
    this.players=new ArrayList<>();
    for (Player p:players){
        this.players.add(p);
    }
}

所以我撤消了更改以获得基本 setter:

public void setPlayers(List<Player> players) {
      this.players=players;
}

但现在我 运行 遇到这个问题,即当将此集合放入数据库或从数据库中提取时,有时 returns 异常:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.pokerface.pokerapi.game.GameState.players, could not initialize proxy - no Session

我很不适应,所以如果我没有准备好适当的信息,我深表歉意。这里应该实现什么样的setter? setter 有问题吗?谢谢。

当我在调试中检查它时,如果我检查存储库中所有存储的对象,它们会退出,但玩家会说“无法计算表达式方法抛出 'org.hibernate.LazyInitializationException'

问题不在于 setter。在我看来,您正在访问 @Transactional 上下文之外的 setter 。在这种情况下,您无法在从数据库中加载包含玩家的对象后访问延迟加载实体。

https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html#transaction-declarative