2015-08-03 56 views
2

我已經有一些名單,看起來像這樣的實體:休眠envers - 裝載歷史嵌套對象

@Entity 
@Table(name = "HOME") 
@Audited 
public class House { 

    @Id 
    private Integer id; 

    @Version 
    @Column(name = "UPDATE_DATE", nullable = false) 
    private Date updateDate; 

    @Column(name = "DESCRIPTION", nullable = false) 
    private String description; 

    @Cascade(CascadeType.ALL) 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "home", orphanRemoval = true) 
    private Set<Room> rooms; 

    [...] 

} 

同時假定間實體看起來像這樣:

@Entity 
@Table(name = "ROOM") 
@Audited 
public class Room { 

    @Id 
    private Integer id; 

    @Version 
    @Column(name = "UPDATE_DATE", nullable = false) 
    private Date updateDate; 

    @Column(name = "NAME", nullable = false) 
    private String name; 

    @Cascade(CascadeType.ALL) 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="HOUSE", nullable=false) 
    private House house; 

    [...] 

} 

正如你看到的房間保存着瀑布。讓我們去我的問題的核心...

PRECONDITINS:在房屋目標

當前數據:

House: 
    description: "red house" 
    rooms: [room1, room2] 

在審覈表中現有的數據:

--- HOUSE_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | DESCRIPTION | 
+-----+---------+----+-----------------+-------------+ 
| 111 | 0  | 10 | 2015-08-3 12:00 | red house | 

--- ROOM_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | NAME | HOUSE | 
| 111 | 0  | 100 | 2015-08-3 12:00 | room1 | 10 | 
| 111 | 0  | 110 | 2015-08-3 12:00 | room2 | 10 | 

使用者步驟:

使用這些數據更新房屋對象(更改房屋描述):

House: 
    description: "blue house" 
    rooms: [room1, room2] 

在此之後操作審覈表看起來就像這樣:

House: 
    description: "blue house" 
    rooms: [room1, room2, room3] 

後:這些數據(不改變房屋目標,並添加一個房間)

--- HOUSE_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | DESCRIPTION | 
+-----+---------+----+-----------------+--------------+ 
| 111 | 0  | 10 | 2015-08-3 12:00 | red house | 
| 112 | 1  | 10 | 2015-08-3 12:30 | blue house | 

--- ROOM_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | NAME | HOUSE | 
| 111 | 0  | 100 | 2015-08-3 12:00 | room1 | 10 | 
| 111 | 0  | 110 | 2015-08-3 12:00 | room2 | 10 | 

更新房屋目標此操作審計表將如下所示:

--- HOUSE_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | DESCRIPTION | 
+-----+---------+----+-----------------+--------------+ 
| 111 | 0  | 10 | 2015-08-3 12:00 | red house | 
| 112 | 1  | 10 | 2015-08-3 12:30 | blue house | 

--- ROOM_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | NAME | HOUSE | 
| 111 | 0  | 100 | 2015-08-3 12:00 | room1 | 10 | 
| 111 | 0  | 110 | 2015-08-3 12:00 | room2 | 10 | 
| 113 | 0  | 120 | 2015-08-3 12:40 | room3 | 10 | 

LOAD經審計的內部數據:

--- current result --- 
HOUSE_A(last_rev) -> HOUSE_A(112) -> 'blue house' with room1 and room2 

--- expected result --- 
HOUSE_A(last_rev) -> HOUSE_A(113) -> 'blue house' with room1, room2 and room3 

這裏的問題是...

房屋最高版本是112,但我已經做了已保存版本113(轉進入最後不是招操作」因爲房屋對象沒有改變,所以被添加到HOUSE_A)。我知道envers加載所有數據的房屋對象的修訂版本少或相等。在這種情況下,最後的操作將不會被加載。問題是 - 加載這些類型操作(主對象沒有更新)的唯一方法是在保存之前更新主對象(house)的最後更新日期,這樣新的條目將被添加到HOUSE_A,其版本與ROOM_A中的版本相同?

在此之後「處理方法」審覈表看起來就像這樣......

--- HOUSE_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | DESCRIPTION | 
+-----+---------+----+------------------+--------------+ 
| 111 | 0  | 10 | 2015-08-30 12:00 | red house | 
| 112 | 1  | 10 | 2015-08-30 12:30 | blue house | 
| 113 | 1  | 10 | 2015-08-30 12:40 | blue house | 

--- ROOM_A --- 
| REV | REVTYPE | ID | UPDATE_DATE  | NAME | HOUSE | 
+-----+---------+-----+------------------+-------+-------+ 
| 111 | 0  | 100 | 2015-08-30 12:00 | room1 | 10 | 
| 111 | 0  | 110 | 2015-08-30 12:00 | room2 | 10 | 
| 113 | 0  | 120 | 2015-08-30 12:40 | room3 | 10 | 
+1

您是否找到實現此目的的方法?我想這樣做 –

回答

0

你沒有提到你正在使用的版本Envers,但是是在啓用了配置屬性Envers 5.x的應該觸發此確切功能:

org.hibernate.envers.revision_on_collection_change=true 

由於Room擁有以Home的關係,在啓用這個配置應該引起Envers錄製版本更改爲Home當次e Room集合被修改。