Alerté par Julien, je fais un peu joujou avec les annotations @OneToOne et Hiernate.
Voici grosso modo ce que je manipule :
@OneToOne( fetch = FetchType.LAZY )
private Foo precedent;
@OneToOne( mappedBy = "precedent", fetch = FetchType.LAZY )
private Foo suivant;
Et là, dès que je charge une instance, j'ai autant de select qui partent en base que j'ai d'éléments dans ma chaîne suivant-précédent...
Le piège, c'est que malgré le LAZY, hibernate veut identifier si la relation OneToOne inverse (mappedBy) est renseignée ou non. En fonction de la réponse il colle un proxy ou null.
La solution, bien que pas très esthétique dans le code est simple : utiliser des OneToMany et se baser sur des collections de 1 élément :
@OneToMany( fetch = FetchType.LAZY )
private Set<Foo> suivants = new HashSet<>();
public Foo getSuivant()
{
Iterator<Foo> it = suivants.iterator();
return it.hasNext() ? it.next() : null;
}
public void setSuivant( Foo suivant )
{
for ( Foo item : suivants )
{
item.setPrecedent( null );
}
this.suivants.clear();
suivant.setPrecedent( this );
suivants.add( suivant );
}
Ca sent la grosse magouille, mais au moins ça ne casse pas la logique des get/set. Comme quoi la persistance "transparente" c'est pas encore tout à fait ça ;)