J'ai 2 tables: Order [OrderId(PK), OrderShipmentCode, ...]
et Shipment[ShipmentId(PK), ShipmentCode, ...]
.
Dans la classe Order
, j'ai déclaré le champ shipment
comme suit:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false)
private Shipment shipment;
Lorsque j'obtiens la liste de Order
, le Shipment
est également chargé (j'ai vu de nombreuses requêtes SELECT distinctes). Mais je veux que le Shipment
soit chargé paresseusement, ne soit pas récupéré avec Order
.
Pour les autres tables, si la colonne référencée est la clé primaire, les résultats sont comme prévu (le chargement différé est utilisé). Dans mon cas, ShipmentCode
n'est pas la clé primaire de la table Shipment
et le chargement différé n'est pas utilisé par Hibernate.
Pourriez-vous me montrer comment atteindre cet objectif?
EDIT: Le code de requête est comme ci-dessous:
Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class);
List result = criteria.list();
Les requêtes SQL sont les suivantes: 1 instruction SELECT pour la table Order
et un groupe d'instructions SELECT pour Shipment
Vous devez spécifier optional = false
:
@OneToOne(optional = false, fetch = FetchType.LAZY)
ou transformez-le simplement en @ManyToOne
:
@ManyToOne(fetch = FetchType.LAZY)
Vous pouvez utiliser @JsonIgnore
dans le champ de commande de l'envoi. Si vous donnez l'aide de MappedBy
sur le champ d'envoi, le supprimer peut résoudre votre problème.
Essaye ça:
Criteria criteria = HibernateUtil.getSessionFactory()
.getCurrentSession()
.createCriteria(Order.class)
.setFetchMode("shipment", FetchMode.LAZY);