反向@OneToMany不可更新

时间:2011-11-30 20:36:24

标签: java hibernate jpa

拥有以下实体:

@Entity
class Transaction implements Serializable {

  @Id @GeneratedValue
  Long id

  @Column(nullable = false, updatable = false)
  Long trNumber

  @OneToMany(mappedBy = "transaction", cascade = CascadeType.ALL, orphanRemoval = true)
  Set<Entry> entries = new HashSet()

  @Column(updatable = false, nullable = false)
  @Temporal(TemporalType.TIMESTAMP)
  Date creationDate
}

我希望条目无法更新,但@OneToMany不允许使用updatable = false属性。

这是Entry实体:

@Entity
class Entry implements Serializable {

  @Id @GeneratedValue
  Long id

  @ManyToOne(cascade= CascadeType.ALL)
  @JoinColumn(updatable = false, nullable = false)
  Transaction transaction

}

每次我们尝试更新事务时,我都可以使用JPA侦听器抛出异常,但我想在实体级别设置updatable = false行为,就像我对其他属性一样。

1 个答案:

答案 0 :(得分:2)

我想你无法在JPA 2.0中使用注释来实现它。我已经阅读了来自Apress的“Pro JPA 2”一书,其中讨论了此类只读关系的未来版本。

我遇到了一个类似的问题,描述了here。我还要求专家组发表任何评论here(在撰写本文时 - 没有给出答案)。

级联不会改变,因为您不必“合并”对象以更改其状态。您只需获取移动到托管状态的Entry(它还将其Transaction移动到托管状态),因此每次更新都必须在数据库中反映出来

@JoinColumn(updatable=false)似乎意味着您无法将Transaction实体更改为其他内容 - 而不是您无法更改其状态。

您可以在获取Transaction后立即分离Entry实体。在这种情况下,对Transaction所做的更改将被保存(它被管理),但Entry将不会(它已分离)。您只需要记住在最后刷新Entry的状态,因为您的内存中表示可能与数据库不相等。