使用@Stateless会话bean在一对多关系中保留2个实体

时间:2015-07-18 15:38:48

标签: hibernate java-ee jpa jta session-bean

你好我正在使用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个单独的事务,它们之间的对象正在分离。

0 个答案:

没有答案