Jpa 将实体与onetomany映射和@version字段合并会导致删除以前的映射

Jpa 将实体与onetomany映射和@version字段合并会导致删除以前的映射,jpa,version,one-to-many,Jpa,Version,One To Many,嗨!全部, 我有两个实体的映射问题。通过@OneToMany单向关系映射。我有一个实体工件,它可以有多个版本。下面是我如何映射它们的 @Entity @Table(name = "artifact") public class Artifact implements Serializable { private static final long serialVersionUID = 248298400283358441L; @Id @GeneratedValue(strateg

嗨!全部,

我有两个实体的映射问题。通过
@OneToMany
单向关系映射。我有一个实体
工件
,它可以有多个
版本
。下面是我如何映射它们的

@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;
修订表保存已更新的文件名;旧价值和新价值等

我面临的问题是,当我更新工件时;最后一个映射被删除,然后插入一个新的映射,因此,如果生效,我只有最后一个但只有一个版本可用,而不是整个版本历史

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
注释,它就可以正常工作

  • 是因为我以错误的方式映射关系吗?是否应该将此关系映射为元素集合
  • 还有另一个实体
    任务
    ,它将与
    修订版
    实体进行映射。那么,这里最好的方法是什么

  • 也许这不是对你问题的直接回答,但我认为你应该研究HibernateEnvers。我认为它也在做类似的事情。(envers代表实体版本控制)。您只需使用@Audited对实体进行注释,然后将一些侦听器放入配置中,剩下的魔术就完成了。

    您能详细说明一下吗?从你的回答中我不太明白。这是默认行为吗?我必须使用@Audited annotations和listeners覆盖它吗?不,默认情况下它不可用,您必须将此库添加到类路径,从这里开始:
    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
            (?, ?)