[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-7071) Error during a entity collection loading - wrong SQL query generation - missing discriminator condition in the "where" clause if associated class has discriminator force=true
Nicolas Bouillon (JIRA)
noreply at atlassian.com
Thu Feb 16 03:54:12 EST 2012
[ https://hibernate.onjira.com/browse/HHH-7071?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Nicolas Bouillon updated HHH-7071:
----------------------------------
Attachment: hibernate-testcase.zip
Test case, surely more clear that a long explanation.
> 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: 3.5.6, 4.0.1
> Environment: MySQL, Hibernate 3.5.6 or 4.0.1
> Reporter: Nicolas Bouillon
> Priority: Critical
> Attachments: hibernate-testcase.zip
>
>
> 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
More information about the hibernate-issues
mailing list