用于CLI应用程序的OpenEntityManagerInViewInterceptor模拟?

时间:2013-06-30 21:44:28

标签: java spring hibernate spring-data spring-data-jpa

CLI应用程序是否有OpenEntityManagerInViewInterceptor的模拟?

我试图在CLI应用程序中使用Spring的CrudRepository和由Hibernate 4支持的JPA数据源。

我的main方法创建包含此方法的类的实例,并使用context.getBeanFactory().autowireBean(object);注入服务。

数据提取服务的方法注释为@Transactional。这些方法调用CrudRepository的方法。

但是当我尝试在CLI应用程序中管理相关实体时,我收到org.hibernate.LazyInitializationException

是否有任何解决方法可以在@Transactional方法之外的CLI应用程序中使用延迟加载来处理Web应用程序的OpenEntityManagerInViewInterceptor

请看下面的代码:

public class test {

    @Autowired
    public UserService userService;

    public static void main(String[] args) {
        test test = new test();
        //injecting dependencies into test
        test.run();
    }

    private void run() {
        User user = userService.findById(42);
        System.out.println(user.getLogin()); //User was fetched successfully
        Address address = new Address("London");
        user.addAddress(address);//Exception in thread "main" java.lang.RuntimeException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection
    }
}

1 个答案:

答案 0 :(得分:0)

我想说CLI没有一个,因为在MVC模式中没有View的概念。但是我怀疑你的问题是由于无效的声明式事务管理造成的。

对于CLI应用程序,请确保您已正确设置数据源,EntityManagerFactory和declarative transaction managemeent

一个好的做法是将业务/ DAO代码放在使用@Service@Repository@Component或其他适当的spring注释注释的服务/存储库类中,创建自己的ApplicationContext并获取参考您的服务:

// UserDAO.java ----------------------------------------
@Repository
public class UserDAO {
  @PersistenceContext private EntityManager em;

  @Transactional
  public User findById(long id) {
    // ...
  }
}

// UserService.java ----------------------------------------
@Service
public class UserService {
  @Autowired private UserDAO userDAO;
  // ...
}

// MainClass.java ----------------------------------------
public class MainClass {
  public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/root-context.xml");
    UserService userService = context.getBean(UserService.class);

    // more code here..

    context.close();
  }
}

只要bean由Spring容器创建,自动装配和声明式事务仍然可以正常工作。