我有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属性造成的。