[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