AOP を使用して Spring Bean を Entity リスナーに注入する道をたどり始めました。1日半の調査とさまざまなことを試した後、次のリンクに出会いました。
Spring Managed Bean を JPA EntityListener クラスに注入することはできません。これは、JPA リスナー メカニズムがステートレス クラスに基づく必要があるためです。そのため、メソッドは事実上静的であり、コンテキストを認識しません。...実装は実際にはインスタンスを作成せず、クラスメソッドを使用するため、AOPの量はあなたを救いません。リスナーを表す「オブジェクト」には何も注入されません。
この時点で、私は再編成して EclipseLink DescriptorEventAdapterに出くわしました。この情報を使用して、Descriptor Adapter を拡張するリスナー クラスを作成しました。
public class EntityListener extends DescriptorEventAdapter {
private String injectedValue;
public void setInjectedValue(String value){
this.injectedValue = value;
}
@Override
public void aboutToInsert(DescriptorEvent event) {
// Do what you need here
}
}
クラスを使用するには、エンティティ クラスで @EntityListeners アノテーションを使用できます。残念ながら、この方法では、Spring がリスナーの作成を制御できず、その結果、依存性注入が許可されません。代わりに、次の「init」関数をクラスに追加しました。
public void init() {
JpaEntityManager entityManager = null;
try {
// Create an entity manager for use in this function
entityManager = (JpaEntityManager) entityManagerFactory.createEntityManager();
// Use the entity manager to get a ClassDescriptor for the Entity class
ClassDescriptor desc =
entityManager.getSession().getClassDescriptor(<EntityClass>.class);
// Add this class as a listener to the class descriptor
desc.getEventManager().addListener(this);
} finally {
if (entityManager != null) {
// Cleanup the entity manager
entityManager.close();
}
}
}
Spring XML 構成を少し追加する
<!-- Define listener object -->
<bean id="entityListener" class="EntityListener " init-method="init">
<property name="injectedValue" value="Hello World"/>
<property name="entityManagerFactory" ref="emf"/>
</bean>
ここで、Spring がエンティティ リスナーを作成し、それに必要な依存関係を注入し、リスナー オブジェクトがリッスンするエンティティ クラスに自身を登録する状況があります。
これが役立つことを願っています。