【问题标题】:merging entity with onetomany mapping and @version field causes delete of the previous mapping将实体与 onetomany 映射和 @version 字段合并会导致删除先前的映射
【发布时间】: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 注释,它可以正常工作。

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

【问题讨论】:

    标签: jpa version one-to-many


    【解决方案1】:

    也许这不是您问题的直接答案,但我认为您应该研究一下休眠环境。我认为它正在做非常相似的事情。 (envers 代表实体版本控制)。您只需使用 @Audited 注释实体,将一些侦听器放入配置中,其余的魔法就为您完成了。

    【讨论】:

    • 您能详细说明一下吗?从你的回答中我没明白多少。这是默认行为,我必须使用 @Audited 注释和侦听器覆盖它吗?
    • 不,默认情况下它不可用,您必须将此库添加到您的类路径中,从这里开始:docs.jboss.org/envers/docs/index.html#quickstart
    猜你喜欢
    • 2015-08-16
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2011-07-13
    相关资源
    最近更新 更多