2

我希望是一个简单的 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;
}

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

这是我目前使用的查询:

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。谢谢!

4

2 回答 2

3

此解决方案也有效:

@ManyToOne()
@JoinColumn(name="BAR_ID", updatable=false)
Bar bar;
于 2013-03-05T22:40:13.870 回答
2

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

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

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

于 2013-03-05T21:29:30.983 回答