J'ai une entité qui peut avoir 0 ou plusieurs enfants de la même entité. En outre, une entité peut avoir 0 ou un parent de la même entité.JoinTable (Parent/Enfant) à moi-même toujours joint à la table lors du chargement
Structure Tables
Account (
AccountId PK,
Name char
etc...
)
AccountRef (
ChildId PK, FK references Account(AccountId)
ParentId PK, FK references Account(AccountId)
)
Tout fonctionne correctement, sauf tout moment je charge un compte, une jointure se fait toujours sur la table de jointure (je suppose pour voir s'il y a un enregistrement AccountRef) . La requête ne revient pas sur l'entité Compte, donc quand je fais account.getMasterAccount(), une jointure est faite à AccountRef et ensuite à Account pour obtenir le master. Encore une fois, tout est correct, mais pas optimal, car la jointure est faite deux fois si nécessaire et une fois quand elle n'est pas nécessaire. Est-ce que le seul moyen de contourner ce problème est d'utiliser des instruments pour LazyToOne, ou y a-t-il une meilleure façon de cartographier cela? C'est une structure de table héritée et je suis incapable de la modifier.
@Entity
Account {
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="masterAccount")
private Set<Account> subAccount;
@ManyToOne(fetch=FetchType.LAZY)
@JoinTable(name="AccountRef",
joinColumns = @JoinColumn(name="childId", referencedColumnName="accountId"),
inverseJoinColumns = @JoinColumn(name="parentId", referencedColumnName="accountId")
)
private Account masterAccount;
Les associations bidirectionnelles sont stockées dans une table distincte, AccountRef, c'est pourquoi j'ai utilisé la table de jointure. Y a-t-il une meilleure façon de cartographier cela? –
expérimenter avec comment cela fonctionne si vous n'avez pas la table de jointure. Vous pouvez réaliser un mappage bidirectionnel sans la table de jointure. La seule fois où vous pourriez ne pas le vouloir, c'est si la relation n'est pas commutative. c'est-à-dire si A est un parent de B ne signifie pas que B est un enfant de A. –
Donc vous dites supprimer la table de jointure et créer une entité séparée pour AccountRef et utiliser le code de l'application pour le garder synchronisé? AccountRef est requis par les applications héritées. –