我有4个实体列在下面的职位。客户机和产品已经在数据库中。问题在于订单和订单产品。我创建Orders对象,然后添加客户机(已经在数据库中)和OrdersProducts的ArrayList,但我得到错误:

object references an unsaved transient instance - save the transient instance before flushing: pl.take.server.model.Orders.clients -> pl.take.server.model.Clients

当我不添加客户机时,只有OrderProducts的ArrayList它在数据库中,但OrderProducts没有外键。怎么了?我使用Mysql服务器和hibernate。
@Entity
public class Clients implements Serializable {

     @Id
     @GeneratedValue
     private int idClient;
     private String clientName, clientSurname, clientCompany;

     @OneToMany(mappedBy = "clients")
     private List<Orders> listOfOrders = new ArrayList<Orders>();
}

@Entity
public class Orders implements Serializable {

     @Id
     @GeneratedValue
     private int idOrder;
     private double totalAmount;

     @ManyToOne
     @JoinColumn(name = "idClientFK")
     private Clients clients;

     @OneToMany(cascade = CascadeType.ALL, mappedBy = "orders")
     private List<OrdersProducts> listOfProductsInOrder = new ArrayList<OrdersProducts>();
}

@Entity
public class OrdersProducts implements Serializable {

    @Id
    @GeneratedValue
    private int idOrderProduct;
    private int productAmount;
    private float productsValue;

    @ManyToOne
    @JoinColumn(name = "idOrderFK")
    private Orders orders;

    @ManyToOne
    @JoinColumn(name = "idProductFK")
    private Products products;
}

@Entity
public class Products implements Serializable {

    @Id
    @GeneratedValue
    private int idProduct;
    private String productName;
    private double productValuePerUnit;
    private String productUnit;
    private int productCount;
    private String productCompany;

    @OneToMany(mappedBy = "products")
    private List<OrdersProducts> listOfOrdersProducts = new ArrayList<OrdersProducts>();
  }

最佳答案

考虑到你有双向关系,如果你想维持一个订单,你必须:
前提条件:SesionScope bean中有一个分离的客户机实体,wiewscope备份bean中有一些分离的产品实体。
在您的商业方法中,您希望坚持您的订单:
创建新的订单实体。
更新“客户订单”关系。
创建OrderProducts实体,每个订单行一个。更新每个OrderProducts实体的“order产品”关系:将对应的产品实体添加到对应的订单产品实体。
去掉“订单行更新“订单->订单行”关系:将每个OrderProducts实体添加到订单实体的列表中。
现在您的新Order和OrderProducts实体已经设置了所有关系。这是JSF框架中的模型。
现在您只需要持久化订单实体,然后订单及其订单行将持久化到数据库中,这是由于“订单->订单行”关系中的cascade属性造成的。

09-16 05:19