org.mise en veille prolongée.loader.MultipleBagFetchException: impossible d'extraire simultanément plusieurs sacs
Voici mon code Ici, je suis à l'aide de plusieurs listes d'extraire des données à partir de la base de données.
Sur l'extraction de données à partir de requête hql il montre d'exception.
Classe Pojo
public class BillDetails implements java.io.Serializable {
private Long billNo;
//other fields
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillPaidDetails> billPaidDetailses = new ArrayList<BillPaidDetails>();
private Set productReplacements = new HashSet(0);
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillProduct> billProductList = new ArrayList<BillProduct>();
//getter and setter
}
hmb.xml fichier
<class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop">
<id name="billNo" type="java.lang.Long">
<column name="bill_no" />
<generator class="identity" />
</id>
<bag name="billProductList" table="bill_product" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillProduct" />
</bag>
<bag name="billPaidDetailses" table="bill_paid_details" inverse="true" lazy="false" fetch="select">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillPaidDetails" />
</bag>
<set name="productReplacements" table="product_replacement" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.ProductReplacement" />
</set>
</class>
Requête Hql
String hql = "select distinct bd,sum(bpds.amount) from BillDetails as bd "
+ "left join fetch bd.customerDetails as cd "
+ "left join fetch bd.billProductList as bpd "
+ "left join fetch bpd.product as pd "
+"left join fetch bd.billPaidDetailses as bpds "
+ "where bd.billNo=:id "
+ "and bd.client.id=:cid ";
Je suis en train requête suivante pour récupérer les données à partir de la base de données, mais c'est en montrant
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
Comment faire pour résoudre ce
Avez-vous essayé de changer vos Listes de Jeux?
Cet article peut vous aider: blog.eyallupu.com/2010/06/...
Quel est le nom de l'id unique de la propriété sur BillProduct?
Place de la Liste sont des Ensembles de travail. Mais je veux faire avec liste
Avez-vous vraiment besoin d'utiliser des listes?
Cet article peut vous aider: blog.eyallupu.com/2010/06/...
Quel est le nom de l'id unique de la propriété sur BillProduct?
Place de la Liste sont des Ensembles de travail. Mais je veux faire avec liste
Avez-vous vraiment besoin d'utiliser des listes?
OriginalL'auteur xrcwrn | 2014-07-10
Vous devez vous connecter pour publier un commentaire.
Comme expliqué dans cet article, Hibernate ne permettent pas de récupérer plus d'un sac parce que, qui permettrait de générer un Produit cartésien.
Vous pouvez changer les sacs à des ensembles, et d'ajouter une
order-by="id"
attribut de "simuler" une liste ordonnée de comportement:Mais juste parce que vous le pouvez, cela ne signifie pas que vous devriez.
Ce que vous pourriez faire est d'aller chercher au plus une collection dans l'original de la requête SQL, tandis que les autres collections sont récupérés par la suite secondaire à l'aide de requêtes. De cette façon, vous pouvez éviter le Produit Cartésien.
Une autre option est d'utiliser multi-niveau de l'extraction de l'enfant de parents d'entités.
Set
s blog.eyallupu.com/2010/06/... en outre, sac à langer à des ensembles de ne pas faire de jointure-extraction du résultat de la requête à moins d'un produit cartésien, ce qui en soi peut être un problème avec les grandes collections.OriginalL'auteur Vlad Mihalcea
Pour moi, j'ai eu le même message d'erreur et je l'ai résolu en ajoutant l'annotation de hibernate
@Fetch
OriginalL'auteur BERGUIGA Mohamed Amine
Vous ne pouvez rejoindre récupérer suite à une relation pour une entité (soitbillPaidDetailses
oubillProductList
).Envisager d'utiliser des paresseux, des associations et de chargement collections, lorsqu'ils sont nécessaires, OU à l'aide de paresseux associations et de chargement collections manuellement avec
Hibernate.initialize(..)
. Au moins c'est la conclusion à laquelle je suis venu quand j'ai eu un problème similaire.de toute façon, il faudra plus qu'une requête à la base de données.vous avez raison, c'est possible. Mais il n'est pas une panacée en terme de performance. Imaginez que je dois charger un conteneur avec, disons 4 séries de 100 éléments. Pas tellement, droite? Rejoignez-extraction du résultat de la requête sera 100000000
Bien sûr, vous avez raison. J'ai vu des cas où plus de 750000 dossiers ont été générés à peuplée de 600 objets. Encore possible 😉
OriginalL'auteur enlait
Changer de
Set
est la meilleure solution. Toutefois, si vous ne pouvez pas remplacer laList
avecSet
(comme dans mon cas, il y a une forte utilisation de JSF balises spécifiques àLists
), et si vous pouvez utiliser de propriété Hibernate annotations, vous pouvez spécifier@IndexColumn (name = "INDEX_COL")
. Cette solution a mieux fonctionné pour moi, de changer deSet
nécessiterait des tonnes de refactoring.Donc, votre code devrait ressembler à ceci:
Comme Igor suggéré dans les commentaires, vous pouvez également créer des méthodes d'approximation pour retourner les listes. Je n'ai pas essayé, mais serait une bonne alternative si vous ne pouvez pas utiliser de propriété Hibernate annotations.
OriginalL'auteur L. Holanda
Votre demande d'aller chercher trop grand nombre de données et mise en veille prolongée ne peut pas charger tous.
Réduire votre demande et/ou de configurer votre entités de récupérer uniquement les données nécessaires
OriginalL'auteur Pracede