Hibernate: LazyInitializationException: échec paresseusement initialiser une collection de rôle. N'a pas pu initialiser proxy - pas de Session
J'ai erreur suivante: nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.Model.entities, could not initialize proxy - no Session
Mon Model
entité:
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);
}
}
Et j'ai une classe de service:
@Service
@Transactional
class ServiceImpl implements Service {
@Override
public void process(Model model) {
...
model.addEntity(createEntity());
...
}
}
Je vais appeler le service à partir d'une autre méthode de service:
@Override
@JmsListener(destination = "listener")
public void handle(final Message message) throws Exception {
Model model = modelService.getById(message.getModelId());
serviceImpl.process(model);
modelService.update(model);
}
Mais quand j'essaie d'appeler cette méthode, je suis d'exception sur la ligne entities.add(entity);
également la même exception se produit lorsque je vais appeler getEntities()
sur model
.
J'ai vérifié le gestionnaire de transactions et qu'il est configuré correctement et de transaction existe sur cette étape. Aussi, j'ai vérifié des tonnes de réponses sur stackoverflow connecté à cette exception, mais rien d'utile.
Ce qui pourrait être la cause de cela?
oui
Est une entité d'un nouvel objet? Si c'est le cas, vous devez enregistrer l'entité premier objet dans la base de données et ensuite vous pouvez l'ajouter dans la liste des entités.
Je suppose que vous avez tort, fait appel de modèle.getEntities() me donne le même message d'erreur à propos de lazyinitialization
OriginalL'auteur Orest | 2017-03-21
Vous devez vous connecter pour publier un commentaire.
Il semble que le modèle est indépendante de l'entité.
Essayez de fusionner et d'effectuer des opérations sur un exemple de fusion:
En fait, je ne veux pas utiliser d'objet de session. Juste avant d'appeler, je suis en train de faire modelService.getModelById(modelId); et il me renvoie un objet de la base de données
Ok mais c'est fait, je suppose, dans une transaction distincte.. une fois que vous processus d'appel de la méthode le modèle est déjà un décollement de l'entité et de fournisseur de persistance ne pas gérer plus. Vous avez l'intégrer. Ou tout simplement faire la requête à l'intérieur de la méthode de traitement.
Merci de votre réponse aidé. Ajouté requête à ma méthode de processus
Ok grande. Content que ça fonctionne pour vous
OriginalL'auteur Maciej Kowalski
Afin @Maciej Kowalski mentionné après la première
@Transactional
lecture de monmodel
il est déjà dans deatached état et appeler pour obtenirentities
à partir d'un autre@Transactional
méthode a échoué avecLazyInitializationException
.J'ai changé mon service un peu pour obtenir
model
à partir de la base de données dans le cadre d'une même opération:Maintenant tout fonctionne comme prévu.
OriginalL'auteur Orest