JPA延迟加载

狮子座Literak

我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与春季或冬眠有关,并且他们的后代不适用或没有帮助。

该应用程序是在Wildfly应用程序服务器上运行的具有JPA2.1的JEE。有两个实体,DAO会话bean和servlet将它们放在一起:

@Entity
@Table(name = "base_user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    int id;

    @OneToMany(fetch=FetchType.LAZY, mappedBy="user")
    List<OAuthLogin> oauthLogins;

}


@Entity
@Table(name = "oauth_login")
public class OAuthLogin implements Serializable {
    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    User user;
}


@Stateless(name = "UserDAOEJB")
public class UserDAO {
    @PersistenceContext(unitName="OAUTHDEMO")
    EntityManager em;

    public User findById(int id) {
        User entity;
    entity = em.find(User.class, id);
        return entity;
    }
}


public class SaveUserServlet extends HttpServlet {
    @EJB
    UserDAO userDAO;

    @Transactional
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = new User(name);
        user.setEmail(email);
        System.out.println("Persisting user " + user);
        userDAO.persist(user);

        OAuthLogin fbLogin1 = new OAuthLogin(user, OAuthProvider.FACEBOOK, "1501791394");
        loginDAO.persist(fbLogin1);

        User user2 = userDAO.findById(user.getId());
        List<OAuthLogin> oauthLogins = user2.getOauthLogins();

当我运行此代码时,它失败并显示:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cz.literak.demo.oauth.model.entity.User.oauthLogins, could not initialize proxy - no Session
org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:572)
org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:212)
org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:551)
org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:140)
org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:294)
cz.literak.demo.oauth.servlets.SaveUserServlet.doPost(SaveUserServlet.java:66)

我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何想法?谢谢

PS。这是一个JPA应用程序,我没有休眠会话等。

或达

您可以使用几种替代方法:

使用级联持久性:

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST})
List<OAuthLogin> oauthLogins;

在您的Servlet中执行以下操作:

User user = new User(name);
user.setEmail(email);
OAuthLogin fbLogin = new OAuthLogin(user, OAuthProvider.FACEBOOK, "1501791394");      
user.getOauthLogins().add(fbLogin) // this is enough assuming uni-directional association
userDAO.persist(user);
List<OAuthLogin> oauthLogins = user.getOauthLogins();

这样就可以了,加上您只有一个事务,并且JDBC调用更少。

这对于特定的Servlet方法调用的特定用例很有帮助。

EJB中的预取集合

public User findById(int id, boolean prefetch) {
    User entity = em.find(User.class, id);
    if (prefetch) {
        // Will trigger 1 or size JDBC calls depending on your fetching strategy
        entity.getOauthLogins().size() 
    }
    return entity;
}

或者,使用条件覆盖获取模式

这对于您想要在保留aOAuthLoginUser同时获取集合的每种情况很有用,FetchType.LAZY并且避免LazyInitializationException仅针对该特定集合。

在视图过滤器中使用打开实体管理器

只是Google,您会发现很多例子

基本上LazyInitializationException这将防止每个懒惰获取的每个关联,每个跨整个实体的应用程序

PS:

  1. 如果不使用Spring,为什么要使用@Transactional(默认情况下甚至不适用于HttpServlet
  2. 它可能已使用某种量身定制的解决方案为WebLogic工作了

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JPA Hibernate集合没有延迟加载

来自分类Dev

春季,Hibernate,JPA:延迟加载ID

来自分类Dev

JPA Hibernate,加入后延迟加载

来自分类Dev

使用Hibernate / JPA / Spring进行Java延迟加载

来自分类Dev

JPA延迟加载未在春季启动工作

来自分类Dev

泽西岛API + JPA /休眠标准延迟加载不起作用

来自分类Dev

Spring Data JPA获取实体外键而不会导致从属实体延迟加载

来自分类Dev

延迟(未加载)集合上的JPA调用方法在分离时无法按预期在Eclipselink中运行

来自分类Dev

使用JPA + Spring时的Hibernate 4和有关延迟加载的改进

来自分类Dev

Spring Data JPA获取实体外键而不会导致从属实体延迟加载

来自分类Dev

@Scheduled 和 @Transactional 方法中的 Spring-data-jpa 延迟加载

来自分类Dev

uicollectionview中的延迟加载

来自分类Dev

延迟加载图片元素

来自分类Dev

webpack 2延迟加载

来自分类Dev

Django延迟加载分页

来自分类Dev

JsonResult禁用延迟加载

来自分类Dev

Windows中的延迟加载

来自分类Dev

延迟加载DbSet

来自分类Dev

ngShow加载延迟问题

来自分类Dev

延迟加载属于

来自分类Dev

延迟加载CSS文件

来自分类Dev

EntityFramework和延迟加载

来自分类Dev

p:panel的延迟加载?

来自分类Dev

PJAX延迟页面加载

来自分类Dev

合并和延迟加载

来自分类Dev

NHibernate不延迟加载

来自分类Dev

快速延迟加载属性

来自分类Dev

休眠延迟加载字段

来自分类Dev

延迟加载XAML