2017-09-18 42 views
1

我遇到了问题,试图选择更新行使用Hibernate的Spring数据作为JPA实现和Postgresql。休眠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; 
} 

假设我们希望与所有相关的B和C实体更新即具有锁定相关的表行来选择。

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

查询将看起来像

SELECT a.column1, ... from tableA a LEFT JOIN tableB b ... FOR UPDATE of a,c 

为一个UPDATE,C

查询将试图锁定两个表是什么导致的异常,如: org.postgresql .util.PSQLException:错误:FOR UPDATE不能应用于外连接的可空侧

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

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

回答

2

PostreSQL不支持此功能。如果你做了一个外部的SELECT,没有任何东西可以阻止某人向LEFT JOINED表中插入一行,从而修改你正在查看的结果集(例如,在重复读取时列不再是NULL)。

如需详细解释,请参阅here