[hibernate-dev] Should EntityManager#refresh retain an existing lock?

Gail Badner gbadner at redhat.com
Wed Jan 31 15:51:54 EST 2018


HHH-12257 involves refreshing an entity that is already has a pessimistic
lock. In the test case attached to the jira, EntityManager#refresh(Object
entity) is used to refresh the entity, instead of a method that specifies a
particular LockModetype (e.g., #refresh(Object entity, LockModeType
lockMode)). The lock on the refreshed entity is dropped.

A workaround is to determine the current lock mode using
Session#getCurrentLockMode, which returns a org.hibernate.LockMode object,
which can be converted to a LockModeType that can be used to call
EntityManager#refresh(Object entity, LockModeType lockMode).

Unfortunately, the code that converts org.hibernate.LockMode to
LockModeType is "internal" (org.hibernate.internal.util.LockModeConverter).

I'm on the fence about how this should work.

The API for EntityManager#refresh(Object entity)  does not say that an
existing lock mode on the entity should be retained.

On the other hand, in JPA 2.1 spec, 3.4 Locking and Concurrency section
seems to indicate that locks on an entity apply to the transaction, and
does say that a lock on an entity should be dropped when refreshed without
an specified LockModeType.

Does anyone have any guidance on how this should work?

Thanks,
Gail


More information about the hibernate-dev mailing list