[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-5275?page=c...
]
Jakob Braeuchi commented on HHH-5275:
-------------------------------------
there also is a difference in the generated sql:
query.*setLockMode*("cat", LockMode.UPGRADE);
generates "select ... *for update of this_.CAT_ID*" with hibernate 3.3.2
query.*setLockOptions*(new LockOptions(LockMode.UPGRADE))
generates "select ... *for update*" with hibernate 3.5.6
according to our oracle-specialist this makes no difference because both ways lock the
whole row.
to make setLockMode() work like setLockOptions() the method MyDialect#getForUpdateString()
could look like this:
{noformat}
public String getForUpdateString(String aliases, LockOptions lockOptions)
{
LockMode lockMode = lockOptions.getLockMode();
Iterator<Map.Entry<String, LockMode>> iter =
lockOptions.getAliasLockIterator();
while(iter.hasNext())
{
// get highest LockMode
Map.Entry<String, LockMode>entry = iter.next();
LockMode lm = entry.getValue();
if (lm.greaterThan(lockMode))
{
lockMode = lm;
}
}
lockOptions.setLockMode(lockMode);
return super.getForUpdateString(aliases, lockOptions);
}
{noformat}
actually the same logic could be applied to
org.hibernate.LockOptions#setAliasSpecificLockMode():
{noformat}
public LockOptions setAliasSpecificLockMode(String alias, LockMode lockMode) {
aliasSpecificLockModes.put( alias, lockMode );
// set higher LockMode
if (this.lockMode.lessThan(lockMode))
{
this.lockMode = lockMode;
}
return this;
}
{noformat}
this worked for the queries i was testing. but i'm not sure if this is the way
LockOptions should work.
Criteria.setLockMode does not work correctly
--------------------------------------------
Key: HHH-5275
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-5275
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.5.2, 3.5.3
Environment: Hibernate 3.5.2, Oracle 10 (using
org.hibernate.dialect.Oracle10gDialect
Reporter: Björn Moritz
Priority: Minor
Fix For: 3.6.1
Attachments: My_Oracle10Dialect.java, My_Oracle10Dialect.java, TestCase.zip
The LockMode set via Criteria.setLockMode does not generate a ' for update' SQL
statement. In the org.hibernate.dialect.Dialect class only the LockOptions are used for
determining a possible addition to the SQL statement if using pessimistic locking. This
behaviour is different from Hibernate 3.1.3.
In the supplied TestCase two threads are reading the same database record; one of those
threads should use pessimistic locking thereby blocking the other thread. But both threads
can read the database record causing the test to fail.
--
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