0

您好,我正在使用 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 保存在数据库中,并且 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 个单独的事务并且它们之间的对象正在分离。

4

0 回答 0