2013-03-05 46 views
2

我有我希望的是一個簡單的JPA問題。說我有下面的類結構:JPA與加入更新

@Entity 
@Table(name="foo_table") 
class Foo{ 
    @Id @Column(name="ID") 
    String id; 
... 
    @ManyToOne() 
    @JoinColumn(name="BAR_ID") 
    Bar bar; 
} 

@Entity 
@Table(name="bar_table") 
class Bar{ 
    @Id @Column(name="ID") 
    String id; 
    @Column(name="COL3") 
    String col3; 
} 

方案:說我要要更新的「酒吧」一「富」的記錄相關聯。

下面是我使用至今查詢:

EntityTransaction tx = em.getTransaction(); 
tx.begin(); 
int rowsUpdated = em.createQuery("UPDATE Foo f SET bar = :bar " + 
        "WHERE f.id = :fooId"). 
        setParameter("fooId", fooId). 
        setParameter("bar", newBar). 
        executeUpdate(); 
tx.commit(); 

問題:是否有可能在JPA更新只更新僅foo_table,但不bar_table做。 DBA不想給我bar_table的更新權限,但似乎JPA想要進行「深度」更新並更新foo_table和bar_table。謝謝!

回答

2

如果我沒有記錯,@ManyToOne的默認行爲是將持久化級聯到所引用的對象。在你的情況下,這意味着Bar也將被更新。你可以用folloing註解控制這樣的:

@ManyToOne(cascade={}) 
@JoinColumn(name="BAR_ID") 
Bar bar; 

這將意味着持續的Foo對象不會影響Bar對象。

+0

我沒有cascadeType.NONE ..這裏是我的選擇:ALL,分離,MERGE,堅持,刷新,REMOVE – rtcarlson 2013-03-05 21:37:11

+0

我不好......你能試着'級聯= {}'?我可能會在這裏混合東西,但我有一種感覺,我有類似的問題... – Magnilex 2013-03-05 21:52:06

+0

我會試一試。 @JoinColumn註釋中還有「可更新」屬性。我試圖將其設置爲false。 – rtcarlson 2013-03-05 21:54:20

3

該解決方案也適用:

@ManyToOne() 
@JoinColumn(name="BAR_ID", updatable=false) 
Bar bar;