public class Primary{
private long id;
@Id
@GeneratedValue(
strategy = GenerationType.IDENTITY
)
@Column(
name = "id"
)
public void getId(){return id;}
//other vars
}
public class Secondary{
//other vars
private Primary primary;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "primary_id", unique = true)
public Primary getPrimary(){return primary;}
}
From this, it is pretty easy to get a Primary Object from a Secondary Object. However, how do I get Secondary Object from a Primary Object without selecting twice in Hibernate?
3 Réponses :
Ajoutez cette méthode Setter dans la classe secondaire
public Primary getPrimary() {
return primary;
}
Et récupérez l'objet principal de la classe secondaire
La classe Primary devrait ressembler à ceci:
@JoinColumn(name = "id", unique = true)
public Primary getPrimary(){return primary;}
Et vous devriez faire une petite modification dans Secondary :
@OneToMany(mappedBy="primary", cascade={CascadeType.ALL})
private List<Secondary> secondaries;
// getter and setter
La colonne de jointure de cause doit faire référence au champ joint ( id ) dans Primary.
La réponse peut être très différente en fonction de ce que vous recherchez.
En fonction de votre mappage actuel, en supposant que vous ayez une instance Primary sous la main, vous pouvez obtenir son correspondant Secondaire par requête. Par exemple. par HQL:
from Primary p left join fetch p.secondaries where ....
et passez votre principal comme paramètre.
Si vous cherchez un moyen de naviguer à partir d'un Principal code> instance d'objet, vous auriez pu créer un mappage bidirectionnel:
class Primary {
@OneToMany(mappedBy="primary", ...)
private Set<Secondary> secondaries;
}
class Secondary {
@ManyToOne
private Primary primary;
}
Vous pourriez vous référer à ma (très ancienne) réponse sur une question connexe sur la façon de la définir. https://stackoverflow.com/a/13812047/395202
Cependant, avoir simplement un bi -la relation directionnelle N'ÉVITE PAS de "sélectionner deux fois", si votre "sélection deux fois" signifie exécuter 2 requêtes SQL dans DB .
Pour réduire un tel aller-retour, il existe plusieurs moyens résoudre. La première consiste à déclarer la relation comme une extraction EAGER. Cependant, c'est une méthode que je ne recommande généralement pas, donc je n'irai pas plus loin.
Une autre façon (à mon humble avis, plus appropriée) est de faire une récupération de jointure lorsque vous récupérez Primary . Pour récupérer l'instance principale avec ses instances secondaires associées, utilisez un HQL comme:
from Secondary s where s.primary = :primary