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 该函数为真,为我解决了这个问题。
我有以下 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 该函数为真,为我解决了这个问题。