2015-07-01 2 views
0

У меня есть следующая иерархия классов: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() использует внутреннее соединение для выбора конкретного объекта.

Есть ли разница между этими объединениями в контексте пессимистической блокировки?

Спасибо!

ответ

0

Некоторые базы данных не поддерживают выбор для обновления с внешним соединением.

в моем случае im с использованием DB2 версии 10.5, которая поддерживает. поэтому проблема остается.

После того, как я выкопал код спящего режима, я обнаружил, что DB2Dialect имеет функцию supportsOuterJoinForUpdate(), которые возвращают false, в то время как предполагается, что true, потому что BD2 поддерживает этот вид выбора. это ошибка в спящем режиме. , расширяющий DB2Dialect и возвращающий true для этой функции, исправил проблему для меня.

Смежные вопросы