2012-01-13 51 views
0

嗨!全部,合併實體與onetomany映射和@version字段導致刪除以前的映射

我有兩個實體的映射問題。通過@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實體。那麼這裏最好的辦法是什麼?

回答

0

也許這不是直接回答你的問題,但我認爲你應該看看hibernate envers。我認爲這是非常相似的事情。 (envers代表實體版本)。你只需用@Audited註解實體,將一些監聽器放入配置中,其餘的魔法就會爲你完成。

+0

請您詳細說明一下嗎?我從你的回答中瞭解不多。這是默認行爲,我必須使用@Audited註釋和偵聽器來覆蓋它? – 2012-01-17 05:25:36

+0

不,默認情況下不可用,您必須將此lib添加到您的類路徑中,從此處開始:http://docs.jboss.org/envers/docs/index.html#quickstart – PiotrkS 2012-01-18 15:17:22