Bonjour à tous,
Le forum officiel hibernate semblant définitivement mort, je viens voir ici si vous pourriez m'aider.
Je vous expose d'abord un peu les entités :
L'entité Parent a une collection d'Administrator (pouvant aller jusqu'à 8000 Admin). Chaque entité Administrator a une association @Any pouvant pointer vers 3 types d'entités différentes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public class Parent { ... @OneToMany(mappedBy="parent", fetch=FetchType.LAZY) @OrderBy("DATE desc") @BatchSize(size=100) @Filter(name="activeOnly") private final Set<Administrator> administrators = new TreeSet<Administrator>(); }J'ai de gros problèmes de performance dans le chargement de l'entité parent, 1 requête étant faite pour chaque association @Any, pour le moment, le meilleur (mais pas glorieux) moyen que j'ai trouvé pour accélerer le chargement est de faire une simple query SQL pour récuperer les ids des entités de l'association @Any et de charger celles-ci par batch de 200 via une query criteria.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class Administrator { some other stuffs... @Any(metaColumn=@Column(name="TYPE"), optional = false, fetch=FetchType.EAGER) @AnyMetaDef(idType="long", metaType="string", metaValues= { @MetaValue(targetEntity=A.class, value="A"), @MetaValue(targetEntity=B.class, value="B"), @MetaValue(targetEntity=C.class, value="C") }) @JoinColumn(name="NUM") private RelationTypeIdentifier<Long> relation; }
Le cache hibernate contiendra ensuite ces entités et elle seront résolues directement depuis le cache sans qu'il soit nécessaire de faire une requête.
En fonctionnant de cette manière le temps de chargement est divisé par 3 mais reste très élevé (dans les 14 secondes pour le chargement complet de l'entité parent).
Malheureusement, je ne peux pas faire de modifications sur la base de données car des centaines de jobs tournent dessus.
Je suis conscient que se fier au cache hibernate pour le chargement n'est pas la meilleure solution mais je n'en vois pas d'autre pour l'instant alors si quelqu'un a d'autres idées, elles seraient les bienvenues.
Merci.
Partager