java - Hibernate 延迟加载字段

标签 java spring hibernate

我在 hibernate 时遇到了这个问题。情况是我正在重新制作我的项目。我之前的项目是使用 JMS,它可以与我的 POJO 顺利运行。现在我正在尝试使用 Apache Mina(套接字编程)和 Google 的 Gson 来重新创建它。

我在字段延迟加载方面遇到问题,因为使用 JMS 的项目通过延迟加载运行顺利,但现在我尝试检索数据库中的某些值,但总是出现 hibernate 异常,指出 失败延迟初始化角色集合:class.field,没有 session 或 session 已关闭我想延迟加载,我不想每次都检索它。

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/)。

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

在您的情况下,您可能希望使用 @Transactional 注释将用户加载和序列化为 JSON 的方法。请注意,如果您有 2 个 Spring 应用程序上下文(一个是根应用程序上下文,一个用于 Spring MVC),则注释很可能仅适用于根应用程序上下文中定义的 bean(因此注释 Controller 可能不起作用,请参阅 @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/

相关文章:

java - 如何分割这个值31.07?

java - 如何为junit编写通用的tearDown方法?

java - 在 JPA 中使用两个或多个参数的搜索查询

java - hibernate 乐观锁和集合的问题

java - Spring 3 依赖注入(inject)和接口(interface)

java - 我如何在 junit 测试中获取部分执行时间

java - ListView 上的可点击图像

java - 如何防止spring security在登录成功后重定向到上一页?

spring - 在 POM 中访问 Spring 配置文件特定的应用程序属性

java - hibernate : unexpected token: and when comparing dates