2016-04-22 15 views
0

私はspringbootアプリケーションを持っており、JPAエンティティの変更履歴を記録するカスタム実装を持っています。Spring JPAは時々挿入エンティティをスキップします

私の主なエンティティは、Testです。これは、Baseクラスから拡張されています。基底クラスは、次の注釈

@EntityListeners(HistoryEntityUpdater.class) 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "object_type") 

私は @PostPersist@PostUpdateで注釈を付けた方法でカスタムエンティティ・リスナーを持っています。これらのメソッドでは、 TestHistoryのインスタンスを作成し、 entityManager.persistを呼び出します。これは動作しますが、履歴レコードの一部は挿入されません。保存が呼び出されたときのログですが、データベースは更新されません。

2016-04-22 19:57:58.428 TRACE 18060 --- [nio-9285-exec-2] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Releasing statement [sql : 'update managed_object set last_updated_time=?, name=?, workflow_status=? where id=?', parameters : ['2016-04-22 19:57:26.185','tests1','ERROR',1]] 
2016-04-22 19:57:58.429 TRACE 18060 --- [nio-9285-exec-2] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Closing prepared statement [sql : 'update managed_object set last_updated_time=?, name=?, workflow_status=? where id=?', parameters : ['2016-04-22 19:57:26.185','tests1','ERROR',1]] 
2016-04-22 19:57:58.429 TRACE 18060 --- [nio-9285-exec-2] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE] 
2016-04-22 19:57:58.429 TRACE 18060 --- [nio-9285-exec-2] o.h.internal.util.SerializationHelper : Starting clone through serialization 
2016-04-22 19:57:58.429 TRACE 18060 --- [nio-9285-exec-2] o.h.internal.util.SerializationHelper : Starting serialization of object [2016-04-22T14:27:26.185Z] 
2016-04-22 19:57:58.429 TRACE 18060 --- [nio-9285-exec-2] o.h.internal.util.SerializationHelper : Starting deserialization of object 
2016-04-22 19:57:58.433 TRACE 18060 --- [nio-9285-exec-2] o.h.internal.util.SerializationHelper : Attempting to locate class [java.time.Ser] 
2016-04-22 19:57:58.434 DEBUG 18060 --- [nio-9285-exec-2] c.b.b.m.db.history.HistoryEntityUpdater : postUpdate [email protected] 
2016-04-22 19:57:58.435 TRACE 18060 --- [nio-9285-exec-2] o.hibernate.engine.spi.IdentifierValue : ID unsaved-value strategy UNDEFINED 
2016-04-22 19:57:58.436 TRACE 18060 --- [nio-9285-exec-2] o.h.e.i.AbstractSaveEventListener  : Transient instance of: com.xyz.model.db.history.TestHistory 
2016-04-22 19:57:58.436 TRACE 18060 --- [nio-9285-exec-2] o.h.e.i.DefaultPersistEventListener  : Saving transient instance 
2016-04-22 19:57:58.437 DEBUG 18060 --- [nio-9285-exec-2] o.h.e.i.AbstractSaveEventListener  : Generated identifier: component[id,revisionTime,revisionType]{revisionType=UPDATED, id=1, revisionTime=Fri Apr 22 19:57:58 IST 2016}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator 
2016-04-22 19:57:58.437 TRACE 18060 --- [nio-9285-exec-2] o.h.e.i.AbstractSaveEventListener  : Saving [com.xyz.model.db.history.TestHistory#component[id,revisionTime,revisionType]{revisionType=UPDATED, id=1, revisionTime=Fri Apr 22 19:57:58 IST 2016}] 
2016-04-22 19:57:58.437 TRACE 18060 --- [nio-9285-exec-2] org.hibernate.engine.spi.ActionQueue  : Adding an EntityInsertAction for [com.xyz.model.db.history.TestHistory] object 
2016-04-22 19:57:58.437 TRACE 18060 --- [nio-9285-exec-2] org.hibernate.engine.spi.ActionQueue  : Adding insert with no non-nullable, transient entities: [EntityInsertAction[com.xyz.model.db.history.TestHistory#[email protected]]] 
2016-04-22 19:57:58.437 TRACE 18060 --- [nio-9285-exec-2] org.hibernate.engine.spi.ActionQueue  : Adding resolved non-early insert action. 
2016-04-22 19:57:58.437 TRACE 18060 --- [nio-9285-exec-2] o.h.a.i.UnresolvedEntityInsertActions : No unresolved entity inserts that depended on [[com.xyz.db.history.TestHistory#[email protected]]] 
2016-04-22 19:57:58.437 TRACE 18060 --- [nio-9285-exec-2] o.h.a.i.UnresolvedEntityInsertActions : No entity insert actions have non-nullable, transient entity dependencies. 
2016-04-22 19:57:58.438 TRACE 18060 --- [nio-9285-exec-2] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE] 
2016-04-22 19:57:58.438 TRACE 18060 --- [nio-9285-exec-2] o.h.e.i.AbstractFlushingEventListener : Post flush 
2016-04-22 19:57:58.438 TRACE 18060 --- [nio-9285-exec-2] org.hibernate.internal.SessionImpl  : before transaction completion 
2016-04-22 19:57:58.440 DEBUG 18060 --- [nio-9285-exec-2] o.h.e.t.internal.jdbc.JdbcTransaction : committed JDBC Connection 
2016-04-22 19:57:58.440 DEBUG 18060 --- [nio-9285-exec-2] o.h.e.t.internal.jdbc.JdbcTransaction : re-enabling autocommit 
2016-04-22 19:57:58.441 TRACE 18060 --- [nio-9285-exec-2] o.h.e.t.i.TransactionCoordinatorImpl  : after transaction completion 
2016-04-22 19:57:58.442 TRACE 18060 --- [nio-9285-exec-2] org.hibernate.internal.SessionImpl  : after transaction completion 
2016-04-22 19:57:58.443 TRACE 18060 --- [nio-9285-exec-2] org.hibernate.internal.SessionImpl  : Closing session 
2016-04-22 19:57:58.443 TRACE 18060 --- [nio-9285-exec-2] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Closing JDBC container [[email protected]] 
2016-04-22 19:57:58.443 DEBUG 18060 --- [nio-9285-exec-2] o.h.e.jdbc.internal.JdbcCoordinatorImpl : HHH000420: Closing un-released batch 
2016-04-22 19:57:58.443 TRACE 18060 --- [nio-9285-exec-2] o.h.e.j.internal.LogicalConnectionImpl : Closing logical connection 
2016-04-22 19:57:58.443 DEBUG 18060 --- [nio-9285-exec-2] o.h.e.j.internal.LogicalConnectionImpl : Releasing JDBC connection 
2016-04-22 19:57:58.443 DEBUG 18060 --- [nio-9285-exec-2] o.h.e.j.internal.LogicalConnectionImpl : Released JDBC connection 
2016-04-22 19:57:58.443 TRACE 18060 --- [nio-9285-exec-2] o.h.e.j.internal.LogicalConnectionImpl : Logical connection closed 

HistoryEntityUpdaterpostUpdatepostPersist方法はEntityListenersはEntityManagerを使用するべきではないこと@Transactional

答えて

2

JPA仕様状態で注釈されています。 これは、あなたを含むほとんどのユースケースでは役に立たなくなります。

私はそれも知らなかった。

スタックトレースから、JDBCトランザクションがすでにコミットされていて、entitymanagerがフラッシュされているようです。 少なくとも、リスナーの実行時にはトランザクションはありません。これにより、書かれた履歴エンティティがデータベースに書き込まれない状況が発生する可能性があります。 EntityListenerはSpringでなく、Hibernateによって呼び出されるため、リスナーの@Transactionalアノテーションは機能しません。

database auditing jpa

は最後に、使用 'Envers' がエンティティの監査を実装するためにあなたのためのソリューションがあり

関連する問題