0

是否有OpenEntityManagerInViewInterceptorCLI 应用程序的类似物?

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

我的main方法创建了一个包含此方法的类的实例,并使用context.getBeanFactory().autowireBean(object);.

用于获取数据的服务具有用 注释的方法@Transactional。这些方法调用CrudRepository的方法。

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

是否有任何解决方法可以使 CLI 应用程序中的延迟加载在Web 应用程序@Transactional等方法之外工作?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
    }
}
4

1 回答 1

0

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

对于 CLI 应用程序,请确保您已正确设置数据源、EntityManagerFactory 和声明性事务管理

一个好的做法是将您的业务/DAO 代码包含在使用 、 或其他适当的 spring 注释注释的服务/存储库类中@Service@Repository创建@Component您自己的 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 容器创建的,自动装配和声明性事务仍将正常工作。

于 2013-07-01T02:24:19.030 回答