实体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是关联的,所有无法直接删除。
浙公网安备 33010602011771号