web-dev-qa-db-ja.com

Hibernate:LazyInitializationException:ロールのコレクションの遅延初期化に失敗しました。プロキシを初期化できませんでした-セッションなし

次のエラーがあります:_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);行で例外が発生します。また、modelgetEntities()を呼び出すと同じ例外が発生します。トランザクションマネージャーをチェックしましたが、正しく構成されており、このステップにトランザクションが存在します。また、私はこの例外に関連するstackoverflowに関する答えのトンをチェックしましたが、有用なものはありません。

その原因は何でしょうか?

12
Orest

モデルは独立したエンティティのようです。

マージインスタンスでマージと操作の実行を試行します。

@Override
public void process(Model model) {
     ...
    Model mergedModel = session.merge(model);

    mergedModel.addEntity(createEntity());
    ...
}
9
Maciej Kowalski

@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());
        ...
    }
}

これで、すべてが期待どおりに機能します。

4
Orest