Inverse @OneToMany不可更新

3

以下是实体:

@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
将CascadeType更改为更严格的选项(而非ALL)是否有效? - DrColossos
1个回答

2
我猜你不能使用JPA 2.0中的注释来实现它。我在Apress出版社的《Pro JPA 2》一书中读到,将来的规范版本将讨论这种只读关系。
我遇到了一个类似的问题,描述在这里。我还向专家组询问了任何评论,在这里(写这篇文章时-没有得到答案)。
级联不会改变,因为您无需“合并”对象即可更改其状态。您只需获取已移至托管状态的Entry(它还使其Transaction移至托管状态),因此每个更新必须最终在数据库中反映出来。
@JoinColumn(updatable=false)似乎意味着您不能将Transaction实体更改为其他内容-而不是不能更改其状态。
在获取Entry后,您可以立即分离Transaction实体。在这种情况下,对Transaction所做的更改将被保存(它已经受控了),但是对Entry所做的更改不会(它是分离的)。您只需要记得最后刷新Entry的状态,因为您的内存表示可能与数据库不等效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接