Ore*_*est 12 java spring hibernate jpa spring-transactions
我有下一个错误: nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.Model.entities, could not initialize proxy - no Session
我的Model实体:
class Model {
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "model", orphanRemoval = true)
@Cascade(CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
public Set<Entity> getEntities() {
return entities;
}
public void addEntity(Entity entity) {
entity.setModel(this);
entities.add(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个服务类:
@Service
@Transactional
class ServiceImpl implements Service {
@Override
public void process(Model model) {
...
model.addEntity(createEntity());
...
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用其他服务方法调用服务:
@Override
@JmsListener(destination = "listener")
public void handle(final Message message) throws Exception {
Model model = modelService.getById(message.getModelId());
serviceImpl.process(model);
modelService.update(model);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我试图调用这个方法我收到线异常entities.add(entity);,当我打电话时,也会发生同样的异常getEntities()上model.我已经检查了事务管理器并且它已正确配置,并且此步骤中存在事务.此外,我已经检查了连接到此异常的stackoverflow上的大量答案,但没有任何用处.
可能是什么原因造成的?
似乎模型是一个独立的实体.
尝试合并并在合并实例上执行操作:
@Override
public void process(Model model) {
...
Model mergedModel = session.merge(model);
mergedModel.addEntity(createEntity());
...
}
Run Code Online (Sandbox Code Playgroud)
因此,正如@Maciej Kowalski 在第一次@Transactional阅读我的文章后提到的那样,model它已经处于分离状态并且entities从另一个@Transactional方法中调用 get失败了LazyInitializationException。
我已经改变了我的服务,以便model在同一个事务中从数据库中获取:
@Service
@Transactional
class ServiceImpl implements Service {
@Override
public void process(long modelId) {
...
Model model = modelDao.get(modelId);
model.addEntity(createEntity());
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在一切都按预期进行。
| 归档时间: |
|
| 查看次数: |
36697 次 |
| 最近记录: |