拥有以下实体:
@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行为,就像我对其他属性一样。
答案 0 :(得分:2)
我想你无法在JPA 2.0中使用注释来实现它。我已经阅读了来自Apress的“Pro JPA 2”一书,其中讨论了此类只读关系的未来版本。
我遇到了一个类似的问题,描述了here。我还要求专家组发表任何评论here(在撰写本文时 - 没有给出答案)。
级联不会改变,因为您不必“合并”对象以更改其状态。您只需获取移动到托管状态的Entry
(它还将其Transaction
移动到托管状态),因此每次更新都必须在数据库中反映出来
@JoinColumn(updatable=false)
似乎意味着您无法将Transaction
实体更改为其他内容 - 而不是您无法更改其状态。
您可以在获取Transaction
后立即分离Entry
实体。在这种情况下,对Transaction
所做的更改将被保存(它被管理),但Entry
将不会(它已分离)。您只需要记住在最后刷新Entry
的状态,因为您的内存中表示可能与数据库不相等。