[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1460) Inconsistent behavior when using Session.get() with multiple subclasses

Olaf Lenzmann (JIRA) noreply at atlassian.com
Mon Nov 13 08:05:05 EST 2006


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1460?page=comments#action_25249 ] 

Olaf Lenzmann commented on HHH-1460:
------------------------------------

IMHO, this should return null. The current behavior is inconsistent and confusing at best - effectively it makes the behavior of the ORM statefully dependent on what read-access has been done in the same transaction before find() is called. This means that you cannot rely on getting null if you try to find an entity with an id that does exist for the type, but you have to be prepared to swallow an exception. Since something like a method exists( Class type, Object id ) does not exist (at least not in EJB3, where we ran into this behavior), checking for the existence of an entity requires us to write wrappers that redirect class-cast exceptions to a false result.  

If you really believe that this makes sense, please document this behavior clearly! The very simple fix would be to make DefaultLoadEventListener.loadFromSessionCache() check the actual type of the entity it finds in the cache (if that's possible based on the data at hand). Alternatively, the current behavior would be perfectly ok if there was an exists() method that works properly.

> Inconsistent behavior when using Session.get() with multiple subclasses
> -----------------------------------------------------------------------
>
>          Key: HHH-1460
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1460
>      Project: Hibernate3
>         Type: Bug

>   Components: core
>     Versions: 3.1.2
>  Environment: Hibernate 3.1.2
> HSQLDB 1.8.0.2
> Java 1.5.0_05-b05
>     Reporter: Seth Fitzsimmons
>  Attachments: ClassCastException.zip
>
>
> Session.get() loads a cached instance of an alternate subclass with the same PK after that subclass has been loaded directly (throwing a ClassCastException where null was expected).  When attempting to load it without prior loading, null is returned, as expected.
> Client and Partner both extend person and have discriminator values of 1 and 2, respectively.  There is a single entry in the database (a Client) with a PK of 0.
> This should be null:
> Partner partner = (Partner) getSession().get(Partner.class, 0);
> assertNull(partner);
> It is.  However, if the Client is loaded first, Hibernate will attempt to return a Partner (as a Client) where it should not exist:
> Client client = (Client) getSession().get(Client.class, 0);
> assertNotNull(client);
>         
> // this should be null, not return a Client object (resulting in a ClassCastException)
> Partner partner = (Partner) getSession().get(Partner.class, 0);
> assertNull(partner);

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list