Bonjour,
J’ai un souci de lazyloading avec mes sous-collections.
J’ai trouvé pas mal de posts sur le sujet, mais je n’arrive toujours pas à régler mon problème (je comprends vite, mais il faut m’expliquer long temps !
)
Donc voici mon problème :
J’ai 1 fiche contrôle lié à 1 établissement lui-même lié à N version/historique d’établissement.
La requête que je souhaite faire dois me remonter la fiche contrôle avec son établissement avec la dernière version de l’établissement. Or lorsque j’accède à la version j’obtiens une erreur :
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: [
].listVersionEtablissement, could not initialize proxy - no Session
Voici le mapping :
1 2 3 4 5 6 7 8
| @Entity
@Table(name="controle")
public class Controle extends AbstractData<Integer> {
[
]
@OneToOne
@JoinColumn(name="code_siret")
private Etablissement etablissement; |
1 2 3 4 5 6 7 8
| @Entity
@Table(name = "etablissement")
public class Etablissement extends AbstractData<String> {
[
]
@OneToMany(mappedBy="erp")
private List<EtablissementVersion> listVersionEtablissement = new ArrayList<EtablissementVersion>(); |
1 2 3 4 5 6 7 8 9 10 11
| @Entity
@Table(name = "etablissement_version")
public class EtablissementVersion extends AbstractData<Integer> {
[
]
@OneToOne
@JoinColumn(name = "code_siret")
private Etablissement erp=new Etablissement();
@Column(name = "numero_version")
private Integer numeroVersion; |
Et voice la requête :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Session session = getSessionFactory().getCurrentSession();
DetachedCriteria maxVersionQuery = DetachedCriteria.forClass(EtablissementVersion.class);
ProjectionList proj = Projections.projectionList();
proj.add(Projections.max("numeroVersion"));
proj.add(Projections.groupProperty("erp"));
maxVersionQuery.setProjection(proj);
Criteria criteria = session.createCriteria(Controle.class);
criteria.createCriteria("etablissement", "etabl", JoinType.INNER_JOIN)
.setFetchMode("etabl", FetchMode.JOIN);
criteria.createCriteria("etabl.listVersionEtablissement").setFetchMode("etabl.listVersionEtablissement", FetchMode.JOIN).add(Subqueries.propertiesEq(new String[] {"numeroVersion", "erp"}, maxVersionQuery));
List<Controle> resutat = (List<Controle>) criteria.list(); |
Si une âme charitable, pouvait m'indiquer où est mon erreur.
Merci d'avance.
Partager