Hibernate 悲观锁定不适用于多态查询

Hibernate pessimistic locking do not work with polymorphic query

我有以下 class 层次结构:

@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);

不工作 - "select for update" 语法不是由休眠生成的 所以该对象没有悲观锁定

同时:

BaseThing entity = (BaseThing) session.get(BaseThing.class, id);
session.refresh(entity, LockOptions.UPGRADE));

正在运行 - 为刷新操作生成了 "select for update" 语法。

refresh() 和 get() 函数之间的区别在于,get() 函数使用外部左连接 select 具体对象,而 refresh() 使用内部连接 ​​select具体对象。

在悲观锁定的上下文中,这些连接之间有区别吗?

谢谢!

有些数据库不支持 select 使用外连接进行更新。

在我的例子中,我使用的是支持的 DB2 10.5 版。 所以问题依旧。

在深入了解 hibernate 代码后,我发现 DB2Dialect 有一个函数 supportsOuterJoinForUpdate() return false,而假设 return true 因为 BD2 支持这种 select.这是一个休眠错误。 扩展 DB2Dialect 并且 return 该函数为真,为我解决了这个问题。