我希望是一个简单的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。谢谢!
答案 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
对象。