Hibernate Postgresql选择要进行外部联接问题的更新

Put*_*tin 5 postgresql hibernate jpa spring-data

我遇到了尝试使用Spring数据和Hibernate作为JPA实现和Postgresql选择更新行的问题。

假设我们有实体:A,B,C。

public class A{
   @Id
   private Long id;

   @OneToMany(fetch = FetchType.EAGER)
   private Set<B> bSet;

   @OneToMany(fetch = FetchType.EAGER)
   private Set<C> cSet;
}
Run Code Online (Sandbox Code Playgroud)

假设我们要选择具有所有相关B和C实体的A进行更新,即与A表相关的锁定行。

@Query(SELECT a FROM A a 
       LEFT JOIN FETCH a.bSet
       LEFT JOIN FETCH a.cSet
       WHERE a.id=?)
@Lock(LockModeType.PESSIMISTIC_WRITE)
public A selectAndLockA(Long Aid);
Run Code Online (Sandbox Code Playgroud)

查询看起来像

SELECT a.column1, ... from tableA a LEFT JOIN tableB b ... FOR UPDATE of a,c
Run Code Online (Sandbox Code Playgroud)

用于更新a,c

该查询将尝试锁定两个导致异常的表,如: org.postgresql.util.PSQLException:错误:FOR UPDATE无法应用于外部联接的可为空的一侧

我尝试归档的是仅锁定第一个表“ FOR UPDATE OF a”

是否可以以某种方式配置或告诉Hibernate仅锁定第一个表。

fho*_*fel 5

PostreSQL不支持此功能。如果您执行外部SELECT,那么什么都不会阻止某人在LEFT JOINED表中插入一行,从而修改您正在查看的结果集(例如,在重复读取时,列将不再为NULL)。

有关详细说明,请参见此处