使用Join进行JPA更新

时间:2013-03-05 21:17:52

标签: java java-ee 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;
}

场景:假设我想更新哪个“Bar”与“Foo”记录相关联。

这是我到目前为止使用的查询:

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 个答案:

答案 0 :(得分:3)

此解决方案也有效:

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

答案 1 :(得分:2)

如果我不记得错,@ManyToOne的默认行为是将持久性级联到引用的对象。在您的情况下,这意味着Bar也将更新。您可以使用以下注释来控制它:

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

这意味着持久化Foo对象不会影响Bar对象。