プロジェクトは、監査に Hibernate 3.5、Spring Webflow 2、および Hibernate Envers を使用します。Envers は hibernate.cfg.xml で構成されます。エンティティ 'ArticleGroup' と 'Article' の間に 1 対多の関係マッピングがあります。テーブル 'articles' には、テーブル 'article_groups' の ID への外部キー 'article_group_id' 参照があります。フロントエンドで記事を削除すると、Hibernate Envers が削除後イベントの制約違反例外をスローします。Envers を使用しない場合、削除操作は正常に機能します。2 つのエンティティは次のように定義されます。
@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 になり、制約違反が発生しました。誰もそれを修正する方法を知っていますか? どうもありがとうございました。