我有服务:
@Override
@org.springframework.transaction.annotation.Transactional
public Seller doSomething(MyDto myDto) {
final MyObject myObject = myDao.findById(myDto.getId());
//do various things to myObject
StateChooser.calculateNewState(myObject);
}
在calculateNewState
的实现中,通过LAZY
对象检索各种EAGER
个集合:
public static void calculateNewState(MyObject myObject) {
List<MyOtherObject> otherObjects = myObject.getEagerObject().getMyLazyCollection();
//etc
myObject.setStatus(calculatedNewStatus);
}
但是我在调用getMyLazyCollection
时遇到了延迟初始化异常。这个集合是@ElementCollection
,如果这有任何区别的话。
我知道该对象需要附加到Hibernate会话才能使代理可以进入数据库,但我不了解该对象是如何分离的。
我尝试了以下配置&#39;方法calculateNewState:
@Component
中实施
@Transactional
@Transactional(PROPAGATION_MANDATORY)
@Transactional
它们都会导致相同的异常:&#34;无法初始化代理 - 没有会话&#34;
我做错了什么?
calculateNewState
方法的目的是在对象的状态被持久化到数据库之前计算它 - 我只是希望共享逻辑,以便可以从各种不同的方法调用它更改对象的数据。
为了澄清,静态方法根本没有注释,只能从注释为@Transaction
的方法内部调用。传递给静态方法的对象是从@Transaction
方法中的DAO加载的。