アプリケーションのエンティティ マネージャー ファクトリをスプリング管理からコンテナー管理に切り替えたところ、問題が発生しました。エンティティの作成中に、エンティティが最後に自動的にフラッシュされる前に、最初に作成されたのと同じトランザクション内でクエリを実行する必要がある場合があります。春には、エンティティ マネージャーは (私が思うに) find を実行する前に自動的にコンテキストをフラッシュし、正しいオブジェクトを返すことができますが、jboss では find メソッドは null を返します。
問題のサンプルを次に示します。
@PersistenceContext
private EntityManager entityManager;
private void test(){
Person person = new Person("firstname", "lastname", "email", "user", "pass", Person.PersonType.admin);
entityManager.persist(person);
assert person.getId() != null;
Person person2 = entityManager.find(Person.class, person.getId());
assert person2 != null; //fail in jboss, ok in Spring
}
とメソッドentityManager.flush()
の間に呼び出しを追加しようとすると、テストを実行しているメソッド/クラスの周りに @Transactional アノテーションをスローするかどうかに関係なく、jboss はエラーをスローします。persist()
find()
javax.persistence.TransactionRequiredException: no transaction is in progress
私の persistence.xml ファイルは を設定しています<property name="org.hibernate.FlushMode" value="auto"/>
が、機能していないようです。
検索を実行する前に jboss にそのコンテキストをデータベースにフラッシュするように指示するのを忘れた構成プロパティはありますか? それとも、ステートメントの順序が間違っていますか?
私のpersistence.xmlとmy-ds.xmlファイルをpastebinに置きました。
助けてくれてありがとう。
編集
解決しました。以下のコメントを参照してください