Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA manytone关系:外键未存储在多方表中_Jpa_Save_Many To One - Fatal编程技术网

JPA manytone关系:外键未存储在多方表中

JPA manytone关系:外键未存储在多方表中,jpa,save,many-to-one,Jpa,Save,Many To One,一对一关系的从属方: @Entity @Table(name="xxx_customer") @XmlRootElement(name="Customer") @XmlAccessorType(XmlAccessType.FIELD) public class Customer implements Serializable { @OneToMany(cascade=CascadeType.ALL, mappedBy="customer") private List<Cred

一对一关系的从属方:

@Entity
@Table(name="xxx_customer")
@XmlRootElement(name="Customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer implements Serializable {

   @OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
   private List<CreditCard> creditCards;


   public void addCreditCart(CreditCard creditCard) {

       creditCards.add(creditCard);
   }

}
@Entity
@Table(name="xxx_credit_card")
@XmlRootElement(name="CreditCard")
@XmlAccessorType(XmlAccessType.FIELD)
public class CreditCard implements Serializable {

    @ManyToOne(optional=false)
    @JoinColumn(name="customer_id", referencedColumnName="id")
    private Customer customer;
}
OrderManager来电创建客户和信用卡记录:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OrderManager {

    @Inject
    @UserDatabase
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void placeOrder(ShoppingCart cart) {

        try
        {
            Customer customer = cart.getCustomer();
            customer.addCreditCart(cart.getCreditCard());
            em.persist(customer);
        }
        catch(Exception ex)
        {
            ctx.setRollbackOnly();

            MessageUtil.addMessage(FacesMessage.SEVERITY_ERROR, 
                    "Place Order", "Error placing order!");

            ex.printStackTrace();
        }
    }
}


在两个表中都创建了数据,但信用卡表的customer_id字段为空。它不包含预期的客户记录id。

为了建立双向关系,您必须确保一侧的更新也会更新另一侧。可以通过如下“添加”或“设置”方法解决此问题:

您可以修改此Customer类(建议的解决方案,因为您在manager代码中使用add方法):

现在,每次更新CreditCard实例中的customer字段时,都会在另一端更新信用卡列表,反之亦然。
您可以修改这两个类,但必须确保不会得到无限循环

代码显示向客户添加信用卡,但正如您所提到的,此关系从属于“信用卡->客户”关系。您是否正在设置信用卡的客户?如果没有它,外键将不会被设置。我在订单和客户之间使用相同类型的关系,订单是拥有方。除非将客户添加到订单中,否则订单表中的customer_id列将填充为expectedIt不会。可能在customer.addOrder方法中,您将订单添加到集合中,并将“this”客户添加到订单中。JPA将实体视为POJO,不会为您维护关系。JPA会维护关系,以免我不得不编写代码:em.persist(customer);creditCard.setCustomerId(customer.getId());em.persist(信用卡);但是这个缩写版本总是使用两个表的主键和填充的外键:customer.setCreditCard(creditCard)em.persist(customer);你明白了,我正试图建立一种双向的关系,也许,正如你所说,它并没有像我认为应该的那样起作用。我将不得不探索这一思路。你的评论是错误的。按照上面的建议在信用卡上设置customer,它就会工作。
@Entity
@Table(name="xxx_customer")
@XmlRootElement(name="Customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer implements Serializable {

   @OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
   private List<CreditCard> creditCards;


   public void addCreditCart(CreditCard creditCard) {
       if(creditCard.getCustomer()!=this) creditCard.setCustomer(this);
       creditCards.add(creditCard);
   }

}  
@Entity
@Table(name="xxx_credit_card")
@XmlRootElement(name="CreditCard")
@XmlAccessorType(XmlAccessType.FIELD)
public class CreditCard implements Serializable {

    @ManyToOne(optional=false)
    @JoinColumn(name="customer_id", referencedColumnName="id")
    private Customer customer;

    public setCustomer(Customer customer){
       if(!customer.getCreditCards().contains(this)) customer.getCreditCards().add(this);
       this.customer=customer;
    }
}