一种解决方案是通过以下方式制作User.orders
一个 热切的 收藏
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Order> orders = new HashSet<Order>();
默认情况下,实体关联是延迟加载的。这意味着orders
Set实际上只是一个代理对象,除非您在其上调用方法,否则它不会被初始化。这很好,因为Order
除非需要它们,否则不会加载关联的对象。但是,如果您尝试在运行的事务之外访问未初始化的集合,则可能会导致问题。
如果您知道在大多数情况下您将需要用户订单,那么使关联热切地获取是有意义的。否则,您将必须确保集合在事务内被初始化/加载。在OpenSessionInViewFilter
你确定提到品牌,交易停留在请求处理过程中打开,这就是为什么你没有在YOUT的webapp这个问题。
如果必须让它延迟加载,请尝试使用Spring TransactionTemplate
将代码包装在您的main方法中:
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
...
}
});