[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1460?page=c...
]
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....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira