У меня есть следующая иерархия классов:Hibernate пессимистичных блокировки не работают с полиморфным запросом
@Entity
@Table(name = "BaseThing")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class BaseThing implements Serializable {
@Id
@Column(name = "id", nullable = false)
private Long id;
@Basic(optional = false)
@Column(name = "name", nullable = false, length = 48)
private String name;
...
}
@Entity
@Table(name = "ConcreteThing")
public class ConcreteThing extends BaseThing {
@Column(name = "aprop", nullable = false, length = 12)
private String aProp;
...
}
@Entity
@Table(name = "AnotherConcreteThing")
public class AnotherConcreteThing extends BaseThing {
@Column(name = "anotherprop", nullable = false, length = 12)
private String anotherProp;
...
}
Я пытаюсь читать и заблокировать ConcreteThing экземпляра, никакой другой транзакция не может прочитать его, используя спящим режим LockOptions.UPGRADE
.
Теперь функция:
BaseThing thing = (BaseThing) session.get(BaseThing.class, id, LockOptions.UPGRADE);
не работает - синтаксис «выбрать для обновления» не порождаются зимуют так нет пессимистичных блокировок на этом объекте
в то время как:
BaseThing entity = (BaseThing) session.get(BaseThing.class, id);
session.refresh(entity, LockOptions.UPGRADE));
работает - синтаксис «выбрать для обновления» создается для операции обновления.
Разница между функциями refresh() и get() заключается в том, что функция get() использует внешнее левое соединение для выбора конкретного объекта, а refresh() использует внутреннее соединение для выбора конкретного объекта.
Есть ли разница между этими объединениями в контексте пессимистической блокировки?
Спасибо!