使用onetomany映射和@version字段合并实体会导致删除先前的映射

时间:2012-01-13 07:15:19

标签: jpa version one-to-many

嗨!所有,

我有两个实体的映射问题。通过@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注释,它可以正常工作。

  1. 是因为我以错误的方式映射关系吗?这种关系应该映射为元素集合吗?
  2. 还有另一个实体Task,它将与Revision实体进行映射。那么这里最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

也许这不是你问题的直接答案,但我认为你应该研究一下hibernate envers。我认为它做的很相似。 (envers代表实体版本控制)。你只需用@Audited注释实体就可以把一些听众放到配置中,剩下的魔法就为你完成了。