Project使用Hibernate 3.5,Spring Webflow 2和Hibernate Envers进行审计。 Envers在hibernate.cfg.xml中配置。我在实体'ArticleGroup'和'Article'之间有一对多的关系映射。表'articles'有一个外键'article_group_id'引用表'article_groups'中的id。在前端,当我删除一篇文章时,Hibernate Envers会为删除后事件抛出约束违例异常。如果我不使用Envers,删除操作工作正常。这两个实体定义如下
@Entity
@Table(name="article_groups")
@Audited
public class ArticleGroup implements Serializable {
@OneToMany(mappedBy="articleGroup", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@OrderBy("id")
private List<Article> articles;
// other fields, getters and setters
}
@Entity
@Table(name="articles")
@Audited
public class Article implements Serializable {
@ManyToOne
@JoinColumn(name = "article_group_id")
private ArticleGroup articleGroup;
// other fields, getters, setters
}
文章删除编码如下:
@Service("articleManager")
public class ArticleManagerImpl implements ArticleManager {
// inject dao
@SuppressWarnings("unchecked")
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void deleteArticle(Article article, Object articles) {
articleDao.delete(article);
((List<Article>) ((OneSelectionTrackingListDataModel)articles).getWrappedData()).remove(article);
}
}
约束违规例外:
Hibernate: delete from live.articles where id=?
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into audit.REVINFO (REVTSTMP, REV) values (?, ?)
Hibernate: insert into audit.articles_AUD (REVTYPE, content, language, name, order_number, title, article_group_id, id, REV) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
82828 [http-bio-8080-exec-2] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - Initiating transaction rollback after commit exception
org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
...
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into audit.articles_AUD (REVTYPE, content, language, name, order_number, title, article_group_id, id, REV) values ('2', NULL, NULL, NULL, NULL, NULL, NULL, '14', '17') was aborted. Call getNextException to see the cause.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2619)
正如您所看到的,当Envers插入表'audit.articles_AUD'时,article_group_id为null,导致约束违规。有谁知道如何解决它?非常感谢你。
答案 0 :(得分:7)
知道了。在配置文件中设置此属性:
<prop key="org.hibernate.envers.store_data_at_delete">true</prop>
参考: http://docs.jboss.org/hibernate/envers/3.6/reference/en-US/html/configuration.html 表3.1。 Envers配置属性 org.hibernate.envers.store_data_at_delete
答案 1 :(得分:3)
如果您正在进行删除后,并且articles_AUD
对articles
或您在此操作期间删除的任何其他条目有任何限制,那么您将尝试添加使用不再存在的引用进入articles_AUD
。
根据经验,我们会将参考文献保留在审计表之外,以便更好地保留修订历史记录。如果审计表包含非审计表的约束,则如果删除了审计表中的任何条目,则修订历史记录可能会中断。
在设置org.hibernate.envers.store_data_at_delete
时参考您的解决方案。
实体数据是否应存储在修订版本中 删除(而不是仅存储id和所有其他属性 空强>)。通常不需要这样做,因为数据存在于 最后一个修订。然而,有时它更容易,更多 在上一次修订中有效地访问它(然后是数据 删除前包含的实体存储两次)。
这告诉我,审计表中的列有NOT NULL
,因此违反约束,因为Envers正在尝试插入null
。您可能希望在审计表中允许null。