我有休眠问题。场景是我正在重新设计项目。我以前的项目是使用JMS,它可以与我的POJO顺利运行。现在我正尝试使用Apache Mina(套接字编程)和Google的Gson重新创建它。

我在字段的延迟加载时遇到问题,因为使用JMS的项目在延迟加载时运行顺利,但是现在我试图在数据库中检索一些值,但始终有一个休眠异常说明我要failed to lazily initialize a collection of role: class.field, no session or session was closed懒惰地加载,我不想每次都检索它。

public class User {
    @Id
    @GeneratedValue
    @Column(name = "iduser")
    private Integer             iduser;

    @Column(name = "firstname")
    private String              firstname;

    @Column(name = "lastname")
    private String              lastname;

    //     this field causes the lazy loading exception
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    @BatchSize(size = 4)
    private Set<Transaction>    transaction;
}


我像这样在我的DAO中检索它

public User findByUser(String username, String pass) {
        // TODO Auto-generated method stub
        try {
            User instance = (User) getSession().createCriteria(User.class)
                    .add(Restrictions.eq(USERNAME, username))
                    .add(Restrictions.eq(PASS, pass)).uniqueResult();
            return instance;
        } catch (RuntimeException re) {
            throw re;
        }
    }


我致电服务的方法

public ModelAndView processSignin(User currentUser, BindingResult result,
            HttpServletRequest request) {
User user = service.signin(currentUser);
//i try to convert it to GSON but when i comment this line of code it works fine. but when gson tries to convert it to json string it seems that the annotations are being executed
System.out.println(gson.toJson(user));
}


调用DAO类的登录方法

public User signinDealer(User user) {
        // TODO Auto-generated method stub
        User currentUser = userDAO.signinUser(user);
        return currentUser;
    }

最佳答案

如果使用Spring和Hibernate(根据问题的标签,情况似乎如此),则可能需要配置Spring事务管理(小型教程:http://www.baeldung.com/2011/12/26/transaction-configuration-with-jpa-and-spring-3-1/)。

然后,您必须注释任何在上使用Hibernate实体的方法(在Spring Bean上)。这将确保任何Hibernate对象都将在会话的上下文中加载,并且如果您碰巧触发了延迟初始化,则Hibernate将能够使用该会话获取对象。

在您的情况下,您可能需要使用@Transactional注释将User加载并序列化为JSON的方法。请注意,如果您有2个Spring应用程序上下文(一个root,一个用于Spring MVC),则注释很可能仅适用于在根应用程序上下文中定义的bean(因此,对控制器进行注释可能不起作用,请参见@Transactional methods in @Controller class are not considred as transactional)。

@Transactional
public String signinAndSerialize(String username, String password) {
    User user = service.signin(username, password);
    return gson.toJson(user);
}

关于java - hibernate 延迟加载字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25173634/

10-11 22:37
查看更多