Error during a entity collection loading - wrong SQL query generation - missing
discriminator condition in the "where" clause if associated class has
discriminator force=true
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key: HHH-7071
URL:
https://hibernate.onjira.com/browse/HHH-7071
Project: Hibernate ORM
Issue Type: Bug
Components: core
Affects Versions: 4.0.1, 3.5.6
Environment: MySQL, Hibernate 3.5.6 or 4.0.1
Reporter: Nicolas Bouillon
Priority: Critical
Given an abstract parent class :
<class abstract="true"
name="pojo.Product" table="Product">
<id column="ID" name="id">
<generator class="native" />
</id>
<discriminator column="type" type="java.lang.String"
force="true" />
[...]
and one (or more) subclasses, defined in a separate file :
<subclass discriminator-value="Childroduct"
extends="pojo.Product"
lazy="true" name="pojo.plugin.ChildProduct">
<join fetch="join" table="ChildProduct">
<key column="productID" />
[...]
The separate file can be loaded or not in the hibernate configuration, with a plugin
system. That's why force=true was placed on the discriminator element.
Given this class that have a relationship with the parent class :
<class name="pojo.ProductCategory">
<id column="ID" name="id">
<generator class="native"/>
</id>
<property name="code"/>
<property name="description"/>
<bag name="products" table="product_productcategory">
<key column="productCategoryID"/>
<many-to-many class="pojo.Product" column="productID" />
</bag>
</class>
The following code throws an exeception :
ProductCategory pc = productCategoryDao.findById(1);
for (Product product: pc.getProducts()) {
System.out.println(product.getId());
}
Caught: org.hibernate.WrongClassException: Object with id: 592 was not of the specified
subclass: pojo.Product (Discriminator: ChildProduct)
org.hibernate.WrongClassException: Object with id: 592 was not of the specified subclass:
pojo.Product (Discriminator: ChildProduct)
at org.hibernate.loader.Loader.getInstanceClass(Loader.java:1626)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1460)
at org.hibernate.loader.Loader.getRow(Loader.java:1384)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:640)
at org.hibernate.loader.Loader.doQuery(Loader.java:856)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2175)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:61)
at
org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:622)
at
org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:82)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1606)
at
org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:379)
at
org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112)
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
The generated SQL to load the Product collection doesn't contains a WHERE clause to
limit the result to known discriminators values.
--
This message is automatically generated by JIRA.
For more information on JIRA, see:
http://www.atlassian.com/software/jira