解决Customer跟Order的级联PERSIST问题
尽信书不如无书,特别在当前国内许多技术图书一片抄,误人子弟的形势下:
Customer级联Order
package com.bookstore.entity; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @Entity @Table(name="customer") public class Customer implements Serializable { private Integer customer_id; private String customer_name; private String password; private String email; private Set<Orders> orders=new HashSet<Orders>(); @Id @GeneratedValue public Integer getCustomer_id() { return customer_id; } public void setCustomer_id(Integer customer_id) { this.customer_id = customer_id; } @Column(name="customer_name",nullable=false,length=32) public String getCustomer_name() { return customer_name; } public void setCustomer_name(String customer_name) { this.customer_name = customer_name; } @Column(nullable=false,length=32) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Column(nullable=false,length=32) public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @OneToMany(mappedBy="customer",cascade=CascadeType.ALL,fetch=FetchType.EAGER) @OrderBy(value="order_id") public Set<Orders> getOrders() { return orders; } public void setOrders(Set<Orders> orders) { this.orders = orders; } }
而Order并不级联Customer:
package com.bookstore.entity; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @Entity @Table(name="orders") public class Orders implements Serializable { private Integer order_id; private Customer customer; private Set<OrderItem> orderItems=new HashSet<OrderItem>(); private double totalprice; @Id @GeneratedValue public Integer getOrder_id() { return order_id; } public void setOrder_id(Integer order_id) { this.order_id = order_id; } @ManyToOne @JoinColumn(name="customer_id") public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } @OneToMany(mappedBy="orders",cascade=CascadeType.ALL,fetch=FetchType.EAGER) @OrderBy(value="orderItem_id") public Set<OrderItem> getOrderItems() { return orderItems; } public void setOrderItems(Set<OrderItem> orderItems) { this.orderItems = orderItems; } @Column(nullable=false) public double getTotalprice() { return totalprice; } public void setTotalprice(double totalprice) { this.totalprice = totalprice; } }
在客户端:
先存入客户,在存入Order,两者不在同一事务中(分开在两个java文件进行),否则:
EntityManager未flush()将customer存入数据库,出现:
org.hibernate.TransientObjectException: object references an unsaved transient instance
save the transient instance before flushing
错误。
浙公网安备 33010602011771号