2013-03-05 2 views
2

간단한 JPA 질문입니다.JPA Update with Join

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

질문 :

는 여기에 지금까지 사용하고 쿼리의 단지에만 foo_table하지만 bar_table하지 업데이트 JPA 업데이트에서 할 수 있습니다. 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, DETACH가, 병합, PERSIST, 새로 고침, – rtcarlson

+0

내 나쁜 ... 제거 당신이 시도 할 수 'cascade = {}'? 나는 여기에 물건을 섞어 놓고 있을지 모르지만 나는 비슷한 문제가 있다는 느낌이 들었다 ... – Magnilex

+0

나는 그것을 시도 할 것이다. 또한 @JoinColumn 주석에 "업데이트 가능"속성이 있습니다. 나는 그것을 거짓으로 설정하려고 노력하고있다. – rtcarlson

3

이 솔루션은 작동합니다

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