JPA代码提炼时遇到的问题处理

首先提炼出一下代码片段:
public ProfileGateway findProfileGateway(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ProfileGateway.class, id);
        } finally {
            em.close();
        }
    }
其他代码调用时只需要传入id就可以获取一个期望的对象,并且不用关注EntityManager的释放。
g=u.findProfileGateway(100);
g.doSome();
u.edit(g);
但是以下情况下会出现问题:
c=g.getCollectionObjects();
for(Object o:c)
    access(o);
运行时会报错误:failed to lazily initialize - no session or session was closed

原因是ProfileGateway默认采取的了Lazy加载的方式获取子对象集合,并且加载完成后EntityManager实例关闭,当代码访问到对象集合时就会出现错误。解决办法有两个:

    1. 关闭Lazy加载

    1. 不访问集合

你可能感兴趣的:(jpa)