【问题标题】:How to test if Hibernate Session is open?如何测试 Hibernate Session 是否打开?
【发布时间】:2016-07-13 02:29:38
【问题描述】:

我面临以下交易错误:

org.hibernate.LazyInitializationException: 延迟初始化失败 角色集合: app.Parent.children,可以 不初始化代理 - 没有会话

这里是parent.getChildren().size()

但我在@Service 方法上有一个@Transactional

  • createFactory() 上的 1 笔交易用于创建工厂并提供给实体管理器
  • create() 上的 1 笔交易用于创建实体
@Path("api/parents")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Controller
public class ParentResource {

    @Autowired
    private ParentService parentService;

    @POST
    public Parent create(Parent parent) {
        ParentFactory parentFactory = parentService.createFactory(parent);
        return parentService.create(parent);
    }

}

@Service
public class ParentService {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public ParentFactory createFactory(Parent parent) {
        return new ParentFactory(parent, em);
    }

    @Transactional
    public Parent create(ParentFactory parentFactory) {
        return parentFactory.create();
    }

}

// No Transactional annotation
public class ParentFactory {

    private Parent parent;
    private EntityManager em;

    public ParentFactory(Parent parent, EntityManager em) {
        this.parent = parent;
        this.em = em;
    }

    public parent create() {
        if(parent.getChildren().size() < 3) { // Exception here
            em.persist(this.parent);
        }
    }

}

我希望能够测试我的 Hibernate Session 何时处于活动状态,以便我可以检查它何时丢失以及丢失的原因。

谢谢!

【问题讨论】:

  • 同时检查会话是否存在也无济于事。您需要弄清楚为什么会出现异常。
  • 事务方法完成后会话立即关闭。您有 2 个事务方法,每个都打开一个新的会话/实体管理器。最初用于Parent 的会话已经关闭,因此出现错误。将该逻辑推送到单个事务服务方法中(恕我直言),而不是在您的控制器中。
  • 谢谢,但是我的问题更多是关于如何检查会话的状态,而不是为什么这个例子实际上失败了。我已经解决了这个问题,但是如果我的休眠会话是打开或关闭的,我想要一种简单的方法来记录:)

标签: java spring hibernate session transactional


【解决方案1】:

我认为处理您的要求的最佳方法是在 children 属性上使用 jpa 验证器 @Size(min=3)

【讨论】:

  • 谢谢@oliv37,但在这里我的问题更多是关于如何知道我何时有一个封闭的会议。
【解决方案2】:

尝试使用 session.getTransaction().isActive()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多