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
}
}
答案 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容器创建,自动装配和声明式事务仍然可以正常工作。