2011-11-16 262 views
2

鉴于以下两个实体JPA:设置@JoinColumn(更新= false)来避免OptimisticLockException

@Entity 
public class A { 
    @Version 
    protected int version; 

    String basicPropertey; 

    // getter and setter for basicProperty 
} 

@Entity 
public class B { 
    @Version 
    protected int version; 

    @ManyToOne 
    private A a; 

    public B(A a) { 
    this.a = a} 
    } 

    //getter for a 
} 

两个问题如下:

  1. 是否有实体A每增加版本号时间 实体B被合并到DB(请注意,没有 CascadeType.MERGE定义在与A的关系上),并因此导致 可能出现OptimisticcLockException,当A与 不同的版本号?

  2. 如果是的话,这将有助于避免,如果我在 关系添加@JoinColumn(updatable=false)的 OptimisticLockException的可能性有多大?

我的情况是,实体B非常频繁升级以及偶尔出现,但只有它的基本属性(非关系),我在实体A.

+0

我不确定什么锁定类型是默认锁定类型,但是您是否尝试用锁定模式(“OPTIMISTIC”与“OPTIMISTIC_FORCE_INCREMENT”)进行摆弄? –

+0

我认为默认情况下它是OPTIMISTIC。我认为这里没什么关系,因为当你明确地使用实体管理器的锁API时,你只能指定锁模式,而我不这样做。我所拥有的只是@Version领域。 – Theo

回答

1

得到一个OptimisticLockException如果只有你改变B,那么你就不能得到A.

锁错误你才会对B.

得到锁错误检查你的SQL登录到你实际上在做什么。

+0

B和A已更新。但B中的更新并未触及其关系A. – Theo