Considérons la classe parent suivante qui a deux références ManyToOne.HIbernate fetch jointure émettant des instructions sql supplémentaires
@Entity
@Table(name = "PARENT")
public class Parent {
private static final long serialVersionUID = 3730163805206219313L;
@Id
@SequenceGenerator(name = "SEQ#PARENT", sequenceName = "SEQ#PARENT", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ#PARENT")
@Column(name = "ID")
private long id;
@ManyToOne(optional = false, fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="CHILD_1_ID", referencedColumnName="FK_COLUMN_NAME")
private Child childInstance1;
@ManyToOne(optional = false, fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="CHILD_2_ID", referencedColumnName="FK_COLUMN_NAME")
private Child childInstance2;
@Column(name = "USER_ID")
private String userId;
}
J'utilise la requête HQL suivante pour charger l'instance parent:
"from Parent p join fetch p.childInstance1 join fetch p.childInstance2 where p.userId = :userId"
Il en résulte toujours en veille prolongée émettant des instructions SQL séparées pour charger les lignes childInstance1 même si elle ne le fetch JOIN.
Toute aide pour éviter les instructions sql supplémentaires est appréciée.
En fait, j'ai trouvé le problème ... il semble que dans votre test, vous avez ignoré la referenceColumnName qui causait le problème. Je référençais une colonne de clé non primaire. Une fois que j'ai modifié la référenceColmumnName à la colonne de la clé primaire de l'enfant, les instructions sql supplémentaires ont disparu. – Sasi
@Sasi Je ne l'ai pas ignoré, j'ai utilisé la valeur par défaut :) (parce que je n'avais aucune idée de ce que FK_COLUMN_NAME était et parce que j'aime les valeurs par défaut). Mais si vous le spécifiez, il doit s'agir de la colonne PK de la table référencée. –