go4it

just do it

解决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

错误。

posted on 2009-01-22 20:08  cxccbv  阅读(414)  评论(0)    收藏  举报

导航