go4it

just do it

实体bean(十三)一对多映射

订单:

package com.persia.jpa.otm;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
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="orders")
public class Order implements Serializable {
	
	private Integer orderid;
	private Float amount;
	private Set<OrderItem> orderItems=new HashSet<OrderItem>();
	private Date createDate;
	
	@Id
	@GeneratedValue
	public Integer getOrderid() {
		return orderid;
	}
	public void setOrderid(Integer orderid) {
		this.orderid = orderid;
	}
	public Float getAmount() {
		return amount;
	}
	public void setAmount(Float amount) {
		this.amount = amount;
	}
	
	@OneToMany(mappedBy="order",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
	@OrderBy(value="id asc")
	public Set<OrderItem> getOrderItems() {
		return orderItems;
	}
	public void setOrderItems(Set<OrderItem> orderItems) {
		this.orderItems = orderItems;
	}
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
	
	public void addOrderItem(OrderItem orderitem){
		if(!this.orderItems.contains(orderitem)){
			this.orderItems.add(orderitem);
			orderitem.setOrder(this);
		}
	}
	
	public void removeOrderItem(OrderItem o){
		o.setOrder(null);
		this.orderItems.remove(o);
	}

}

 

订单项:

package com.persia.jpa.otm;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="orderItems")
public class OrderItem implements Serializable {

	private Integer id;
	private String productname;
	private Float price;
	private Order order;
	
	public OrderItem(){}
	
	public OrderItem(String productname,Float price){
		this.productname=productname;
		this.price=price;
	}

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getProductname() {
		return productname;
	}

	public void setProductname(String productname) {
		this.productname = productname;
	}

	public Float getPrice() {
		return price;
	}

	public void setPrice(Float price) {
		this.price = price;
	}

	@ManyToOne(cascade=CascadeType.PERSIST,optional=false)
	@JoinColumn(name="order_id")
	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}
	
	
}

 

DAO操作:

package com.persia.jpa.otm;

import java.util.Date;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
@Remote({OrderDAO.class})
public class OrderDAOBean implements OrderDAO {

	@PersistenceContext
	private EntityManager em;
	
	@Override
	public void deleteItem(Integer id) {
		OrderItem it=em.find(OrderItem.class, id);
		Order o=it.getOrder();
		o.getOrderItems().remove(it);
		it.setOrder(null);
		em.remove(it);

	}

	@Override
	public List getAllOrder() {
		Query q=em.createQuery("from Order");
		List rs=q.getResultList();
		return rs;
	}

	@Override
	public Order getOrderByID(Integer orderid) {
		Order o=em.find(Order.class, orderid);
	//	o.getOrderItems().size();延迟加载时使用
		return o;
	}

	@Override
	public void insertOrder() {
		Order o=new Order();
		o.setCreateDate(new Date());
		o.addOrderItem(new OrderItem("笔记本",new Float(10000)));
		o.addOrderItem(new OrderItem("U盘",new Float(200)));
		o.setAmount(new Float(10000+200));
		em.persist(o);
		

	}

}

 

测试代码:

package com.persia.jpa.otm.test;

import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.persia.jpa.otm.Order;
import com.persia.jpa.otm.OrderDAO;
import com.persia.jpa.otm.OrderItem;

public class TestOTM {

	/**
	 * @param args
	 * @throws NamingException 
	 */
	public static void main(String[] args) throws NamingException {
		Properties props=new Properties();
	      props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
	      props.setProperty("java.naming.provider.url","localhost:1099");
	      props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
		InitialContext context=new InitialContext(props);
		try{
			OrderDAO dao=(OrderDAO)context.lookup("OrderDAOBean/remote");
		//	dao.insertOrder();
			dao.deleteItem(new Integer(1));
			List ls=dao.getAllOrder();
			if(ls!=null){
				for(int i=0;i<ls.size();i++){
					Order od=(Order)ls.get(i);
					if(od!=null){
						System.out.println("=====订单号:"+od.getOrderid()+"=====");
						Iterator itr=od.getOrderItems().iterator();
						while(itr.hasNext()){
							OrderItem oi=(OrderItem)itr.next();
							System.out.println("订购产品"+oi.getProductname());
						}
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		

	}

}

运行结果:

=====订单号:1=====
订购产品???

 

数据库:

mysql> desc orders;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| orderid    | int(11)  | NO   | PRI | NULL    | auto_increment |
| amount     | float    | YES  |     | NULL    |                |
| createDate | datetime | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> desc orderitems;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| productname | varchar(255) | YES  |     | NULL    |                |
| price       | float        | YES  |     | NULL    |                |
| order_id    | int(11)      | NO   | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> select * from orderitems;
+----+-------------+-------+----------+
| id | productname | price | order_id |
+----+-------------+-------+----------+
|  2 | ???         | 10000 |        1 |
+----+-------------+-------+----------+
1 row in set (0.00 sec)

mysql> select * from orders;
+---------+--------+---------------------+
| orderid | amount | createDate          |
+---------+--------+---------------------+
|       1 |  10200 | 2009-01-20 13:08:37 |
+---------+--------+---------------------+
1 row in set (0.00 sec)
 
至于数据库乱码,有待解决。
 
--------------------------------------------------------------------
如果把加载模式改为fetch=FetchType.LAZY则在getAllOrder()的时候
public List getAllOrder() {
	
        Query q=em.createQuery("select o from order o inner join fetch o.orderItems order by o.orderId");
        List rs=q.getResultList();
	 return rs;
		 
	}
并且,在删除many这一端的一个对象的时候可以直接使用以下代码:
public void deleteItem(Integer id) {
		
        /*使用fetch=FectchType.LAZY*/
          OrderItem it=em.find(OrderItem.class,id);
          em.remove(it);
          
         /* 这是因为使用延迟加载获得OrderItem对象时并没有加载Order对象,
         * OrderItem对象并没有和Order对象关联,所有可以直接删除OrderItem对象。
         * */
	}
如果使用EAGER加载而直接删除OrderItem的话,会发生
java.lang.IllegalArgumentException:attempt to create delete event with null entity.
因为立即加载后获得的OrderItem和它对应的Order是关联的,所有无法直接删除。
 

posted on 2009-01-20 13:21  cxccbv  阅读(680)  评论(0)    收藏  举报

导航