嗨!所有,
我有两个实体的映射问题。通过@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
实体进行映射。那么这里最好的方法是什么?答案 0 :(得分:0)
也许这不是你问题的直接答案,但我认为你应该研究一下hibernate envers。我认为它做的很相似。 (envers代表实体版本控制)。你只需用@Audited注释实体就可以把一些听众放到配置中,剩下的魔法就为你完成了。