将实体与 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 字段合并会导致删除先前的映射的主要内容,如果未能解决你的问题,请参考以下文章

@OneToMany 映射休眠中的集合

如何将DTO映射到多个实体?

Hibernate OneToMany SELECT 在实体的映射中给出重复的列

JPA一对多映射

在 Hibernate 双向 ManytoOne、OnetoMany 的映射列中获取 null

Hibernate - OneToMany 单向映射 - SQLGrammarException