将实体与 onetomany 映射和 @version 字段合并会导致删除先前的映射
Posted
技术标签:
【中文标题】将实体与 onetomany 映射和 @version 字段合并会导致删除先前的映射【英文标题】:merging entity with onetomany mapping and @version field causes delete of the previous mapping 【发布时间】:2012-01-13 07:15:19 【问题描述】:嗨!全部,
我有两个实体的映射问题。通过@OneToMany
单向关系映射。我有一个实体Artifact
,它可以有多个Revision
。这是我绘制它们的方式
@Entity
@Table(name = "artifact")
public class Artifact implements Serializable
private static final long serialVersionUID = 248298400283358441L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Version
private Integer version;
...
@OneToMany(cascade = CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE )
@JoinTable(name = "artifact_revisions", joinColumns = @JoinColumn(name = "artifact_id"), inverseJoinColumns = @JoinColumn(name = "revision_id"))
private Set<Revision> revisions;
还有修订实体
@Entity
@Table(name = "revision")
public class Revision implements Serializable
private static final long serialVersionUID = -1823230375873326645L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
@Column(name = "date_created", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
修订表保存被更新的文件名;旧值和新值等。
我面临的问题是当我更新工件时;最后一个映射被删除,然后它插入一个新的,所以如果效果我只有最后一个但一个修订可用,而不是整个修订历史。
Hibernate:
update
artifact
set
description=?,
estimate=?,
name=?,
rank=?,
status=?,
sysId=?,
version=?
where
id=?
and version=?
Hibernate:
delete
from
artifact_revisions
where
artifact_id=?
and revision_id=?
Hibernate:
insert
into
artifact_revisions
(artifact_id, revision_id)
values
(?, ?)
如果我从工件中删除 @version
注释,它可以正常工作。
-
是因为我以错误的方式映射关系吗?是否应该将此关系映射为元素集合?
还有另一个实体
Task
将与Revision
实体进行映射。那么这里最好的方法是什么?
【问题讨论】:
【参考方案1】:也许这不是您问题的直接答案,但我认为您应该研究一下休眠环境。我认为它正在做非常相似的事情。 (envers 代表实体版本控制)。您只需使用 @Audited 注释实体,将一些侦听器放入配置中,其余的魔法就为您完成了。
【讨论】:
您能详细说明一下吗?从你的回答中我没明白多少。这是默认行为,我必须使用 @Audited 注释和侦听器覆盖它吗? 不,默认情况下它不可用,您必须将此库添加到您的类路径中,从这里开始:docs.jboss.org/envers/docs/index.html#quickstart以上是关于将实体与 onetomany 映射和 @version 字段合并会导致删除先前的映射的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate OneToMany SELECT 在实体的映射中给出重复的列