次のエラーがあります:_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);
}
}
_
そして、私はサービスクラスを持っています:
_@Service
@Transactional
class ServiceImpl implements Service {
@Override
public void process(Model model) {
...
model.addEntity(createEntity());
...
}
}
_
別のサービスメソッドからサービスを呼び出しています。
_@Override
@JmsListener(destination = "listener")
public void handle(final Message message) throws Exception {
Model model = modelService.getById(message.getModelId());
serviceImpl.process(model);
modelService.update(model);
}
_
しかし、このメソッドを呼び出そうとすると、entities.add(entity);
行で例外が発生します。また、model
でgetEntities()
を呼び出すと同じ例外が発生します。トランザクションマネージャーをチェックしましたが、正しく構成されており、このステップにトランザクションが存在します。また、私はこの例外に関連するstackoverflowに関する答えのトンをチェックしましたが、有用なものはありません。
その原因は何でしょうか?
モデルは独立したエンティティのようです。
マージインスタンスでマージと操作の実行を試行します。
@Override
public void process(Model model) {
...
Model mergedModel = session.merge(model);
mergedModel.addEntity(createEntity());
...
}
@Maciej Kowalskiがmodel
の最初の@Transactional
読み取りの後で言及したように、それはすでに切り離された状態にあり、別の@Transactional
メソッドからentities
を取得する呼び出しがLazyInitializationException
で失敗しました。
同じトランザクションでデータベースからmodel
を取得するようにサービスを少し変更しました。
@Service
@Transactional
class ServiceImpl implements Service {
@Override
public void process(long modelId) {
...
Model model = modelDao.get(modelId);
model.addEntity(createEntity());
...
}
}
これで、すべてが期待どおりに機能します。