8
@EntityListnersでアノテーションされたエンティティクラスを使用するRESTful APIがあります。また、EntityListner.javaに@PostPersistというアノテーションを付けたメソッドがあります。そのイベントが発生すると、データベースに永続化されたエンティティに関するすべての情報を抽出します。しかし、私がそれをやろうとすると、Glassfishは例外を生成していて、EntityListnerクラスのメソッドは期待通りに実行されません。私はCUSTDATAの代わりにコメントアウトsuccessMessageメッセージを送信する場合はここでコードJPAライフサイクルイベントを使用してエンティティデータを取得する方法
public class EntityListner {
private final static String QUEUE_NAME = "customer";
@PostUpdate
@PostPersist
public void notifyOther(Customer entity){
CustomerFacadeREST custFacade = new CustomerFacadeREST();
Integer customerId = entity.getCustomerId();
String custData = custFacade.find(customerId).toString();
String successMessage = "Entity added to server";
try{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// channel.basicPublish("", QUEUE_NAME, null, successMessage .getBytes());
channel.basicPublish("", QUEUE_NAME, null, custData.getBytes());
channel.close();
connection.close();
}
catch(IOException ex){
}
finally{
}
}
}
で、すべてが正常に動作します。
http://www.objectdb.com/java/jpa/persistence/eventはエンティティのライフサイクルメソッドに関して以下のように述べています。コールバックメソッドはEntityManagerのまたはクエリメソッドを呼び出すべきではなく、他の任意のエンティティが
オブジェクトアクセスするべきではない
(まだ進行中である)エンティティのライフサイクルイベントを発生させ、元のデータベース操作との競合を避けるため何か案は?
String custData = custFacade.find(customerId).toString();
find
は、暗黙的に(あなたが説明するように)オブジェクトを照会するように見える、ではないかもしれない:
例外はありますか? –
例外とスタックトレースを含めます。ありがとう@Heiko; – James