web-dev-qa-db-fra.com

Hibernate: @ManyToOne (fetch = FetchType.LAZY) ne fonctionne pas sur la colonne référencée par clé non primaire

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

18
Nghia Le

Vous devez spécifier optional = false:

@OneToOne(optional = false, fetch = FetchType.LAZY)

ou transformez-le simplement en @ManyToOne:

@ManyToOne(fetch = FetchType.LAZY)
1
Vlad Mihalcea

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.

0
Syam Dorjee

Essaye ça:

Criteria criteria = HibernateUtil.getSessionFactory()
                                 .getCurrentSession()
                                 .createCriteria(Order.class)
                                 .setFetchMode("shipment", FetchMode.LAZY);
0
shady