如何测试Hibernate Session是否打开?

时间:2016-03-25 10:25:11

标签: java spring hibernate session transactional

我面临交易错误:

  

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

此处parent.getChildren().size()

但我的@Transactional方法确实有@Service

  • 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会话何时处于活动状态,以便我可以检查它何时丢失以及为什么会丢失。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-2)

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