在CREATE(0)上启用@OneToMany审核,但不在DELETE(2)上审核

时间:2011-01-21 20:04:02

标签: hibernate audit hibernate-envers

我看了很多类似的问题:http://community.jboss.org/message/580407#580407但尚未找到解决方案。

一个Activity有很多出现,当创建出现时,activity_occurence_AUD表使用0(创建)版本正确更新。

但是,当删除出现时,activity_occurence_AUD表中没有填充2(删除)修订版。

活动实体:

@Entity
@Table(name = "activity")
@Audited
public class Activity implements Serializable {
    private static final long serialVersionUID = 1L;

    public static final int[] VALID_PRIORITIES = { 0, 1, 2, 3 };

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "activity")
    private List<ActivityOccurrence> activityOccurrenceList;

....

}

ActivityOccurence Entity:

@Entity
@Table(name = "activity_occurrence")
@Audited    
public class ActivityOccurrence implements Comparable<ActivityOccurrence>, Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

    @JoinColumn(name = "activity_id", referencedColumnName = "id", nullable = false)
    @ManyToOne(optional = false)
    private Activity activity;

....

}

hibernate属性:

<entry key="hibernate.ejb.event.post-insert"     
  value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" />
<entry key="hibernate.ejb.event.post-update"
  value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" />
<entry key="hibernate.ejb.event.post-delete"
  value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" />
<entry key="hibernate.ejb.event.pre-collection-update"
  value="org.hibernate.envers.event.AuditEventListener" />
<entry key="hibernate.ejb.event.pre-collection-remove"
  value="org.hibernate.envers.event.AuditEventListener" />
<entry key="hibernate.ejb.event.post-collection-recreate" 
  value="org.hibernate.envers.event.AuditEventListener" />

非常感谢任何帮助。

奇怪的是,更新有效,但删除却没有。

如果我能提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

在这里挖掘旧的,但我想我知道答案,但这只是因为我本周末遇到了同样的问题。

你在做什么:

Activity.getActivityOccurrenceList().remove(OCCURRENCE);

或者你在做什么:

Activity.setActivityOccurrenceList(NEW_LIST_EXLUDING_REMOVED_OCCURRENCE);

第一个应该给你一个2的REVTYPE,而第二个选项可能会给你一个REVTYPE为0。

当然我可能是错的,因为我的例子是ManyToMany并且有一个连接表但是从我的修修补补来看这就是我认为它的工作方式。

在我的情况下,但使用你的例子; spring正在触发活动事件列表,每次执行此操作时spring会创建一个新列表,导致REVTYPE为0(ADD),即使我实际删除了一个事件。

您最终是否自己找到了解决方案?如果是这样你可以分享吗?