]
Dobes Vandermeer commented on HHH-3762:
---------------------------------------
Originally I discussed this (with myself over an afternoon) in this forum thread:
LockMode.UPGRADE and TABLE_PER_CLASS and PostgreSQL generates
usupported SQL
----------------------------------------------------------------------------
Key: HHH-3762
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-3762
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.3.1
Environment: Hibernate 3.3.1.GA, PostgreSQL 8.2, Hibernate-Annotations,
Hibernate-EntityManager, Glassfish v2ur2, Windows Vista 64.bit
Reporter: Dobes Vandermeer
Priority: Minor
I created a class called Job and a few subclasses such as SendEmailJob,
ProcessSubscriptionsJob, and so on. I set the inheritance type to TABLE_PER_CLASS since
the columns in each are quite different. However, the worker that loads and executes the
jobs is the same.
The worker was trying to use a piece of code like this:
@Timeout
public void timeout(Timer timer) {
session.get(Job.class, (Long)timer.getInfo(), LockMode.UPGRADE);
}
PostgreSQL returned the following error:
org.postgresql.util.PSQLException: ERROR: SELECT FOR UPDATE/SHARE is not allowed with
UNION/INTERSECT/EXCEPT
The workaround was to lock the object separately, so hibernate only tries to select ..
for update from one table:
@Timeout
public void timeout(Timer timer) {
Job job = session.get(Job.class, (Long)timer.getInfo(), LockMode.NONE);
session.refresh(job, LockMode.UPGRADE); // Now there's just one table involved
}
A possible solution to this issue would be for hibernate to do this breakdown
automatically when doing a get() on a TABLE_PER_CLASS superclass - i.e. it would ignore
LockMode when fetching, but if LockMode is > UPGRADE it would call refresh() with that
lock mode on the found object (if any) to lock it. This does introduce an extra SELECT
but I can't really think of another solution for this use case.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: