こんにちは、私は 2 つの @Stateless セッション Bean ClientFacade と CreditCardFacade を使用しています。このファサードを使用して両方のエンティティを保持し、Client を CreditCard に関連付けたいと考えています。
クライアントは @OneToMany (逆サイド) で、CreditCard は @ManyToOne (所有サイド) です。
単体テストを書きました:
Client client = new Client("Credit card owner.");
client = clientFacade.create(client);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);
// create instance of CreditCard
CreditCard creditCard = new CreditCard(client, "4129239494949494", cal.getTime(), "First Last", CreditCardType.VISA );
creditCard = cardFacade.create(creditCard);
clientFacade.refresh(client);
assertNotNull("Should assign new Credit Card to existing Client.", client.getCreditCards());
assertTrue(client.getCreditCards().contains(creditCard));
cardFacade.remove(creditCard);
assertTrue(cardFacade.count() == 0);
assertNull(cardFacade.find(new CreditCardId(client.getClientId(), "4129239494949494", cal.getTime())));
clientFacade.remove(client);
しかし、ここでの問題は、クライアントとクレジットカードがDBに永続化され、クレジットカードが外部キーをクライアントに設定していることですが、client.getCreditCards()にアクセスしようとすると、データベースにそのような関係があるにもかかわらずnullです、そして私は以前にクライアントエンティティを更新していましたが。これが JTA の代わりに RESOURCE_LOCAL で類推的に行われた場合、そのようなアプローチは完全にうまく機能します。
更新しました
この方法でエンティティを変更しました:
public void setClient(Client client) {
this.client = client;
if(!client.getCreditCards().contains(this)) {
client.getCreditCards().add(this);
}
}
と:
public void addCreditCard(CreditCard creditCard) {
this.creditCards.add(creditCard);
if(creditCard.getClient() != this) {
creditCard.setClient(this);
}
}
そして今、上記と同様の方法で(リフレッシュせずに)永続化しようとすると、次のような例外が発生します。
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: pl.salonea.entities.Client
このような Facade EJB を組み合わせて使用し、関係を維持するにはどうすればよいかを考えます。EntityTransaction を使用して単一のトランザクションでこの関係を保持している場合、すべてが正しく保持されているようです。しかし、AbstractFacade パターンを使用して EJB @Stateless を保持しようとすると失敗します。なぜこのような方法でこれを保存できるのか、この問題を解決できません。2 つの別々のトランザクションがあり、それらの間でオブジェクトが切り離されていることが原因である可能性があります。