你好我正在使用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);
但这里的问题是客户端和creditCard持久保存在DB中,而creditCard已将外键设置为客户端, 但是当我尝试访问client.getCreditCards()时,尽管事实上数据库中存在这样的关系,并且尽管我之前已经刷新了客户端实体,但它仍然是空的。 如果这是在RESOURCE_LOCAL而不是JTA中类似地进行的,那么这种方法非常有效。
已更新
我以这种方式修改了实体:
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个单独的事务,它们之间的对象正在分离。