1、JavaEE之JPA关系操作实验5. JPA关系操作实验内容建立EJB项目,实现双向1-N关联。一张订单中存在一个或多个订购项。One方存在与many方关系定义,而many方也存在与one方关系的定义,这样的关系称为双向关系。代码上体现为one方有一个集合属性指向many方,而many方也有一个属性指向one方。建立一个EJB项目,实现上述关系。生成实体类:Order(one方)与OrderItem(many方);实现添加订单功能:显示订单列表;删除订单;修改订单;建立实体Bean,并生成对实体进行操作的会话Bean,能够完成基本的增删改查操作,编写Web客户端程序进行测试。实验目的 掌握实体
2、类之间的关系的实现; 能够通过JPA对具有关系的实体类进行操作; 能够对具有关系的实体进行复杂的查询。实验介绍(整体与本实验) 本试验要求学生已经掌握实体类的生成过程,以及简单Java持久性API的用法。环境要求服务器:Jboss 6.0集成开发环境: MyEclipse8.6数据库:MySql及其驱动程序实验指导步骤1:建立EJB项目,并设计实体Bean、会话Bean1. 建立EJB项目,如图5-1所示。图5-12. 输入项目名称,并单击下一步,如图5-2所示。图5-23. 设置JPA persistence,完成后单击finsh,如图5-3所示。图5-34. 生成项目结构如图5-4所示。
3、图5-45. 修改persistence.xm文件,如图5-5、图5-6所示。图5.5 图5.66. persistence.xml文件内容如下: java:/MySqlDS 7. 在src下建立三个包,结构如图5-7所示。图5.7a) 在包cn.edu.ejb3.bean下设计两个实体Bean:Order.java、OrderItem.java代码如下:Order.java:package cn.edu.ejb3.bean;import java.io.Serializable;import java.util.HashSet;import java.util.Date;import jav
4、a.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;import javax.persi
5、stence.Temporal;import javax.persistence.TemporalType;EntityTable(name = Orders)public class Order implements Serializable private static final long serialVersionUID = 4970325922198249712L; private Integer orderid; private Float amount; private Set orderItems = new HashSet(); private Date createdate
6、; 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.LAZY
7、) OrderBy(value = id ASC) public Set getOrderItems() return orderItems; public void setOrderItems(Set orderItems) this.orderItems = orderItems; Temporal(value=TemporalType.TIMESTAMP) public Date getCreatedate() return createdate; public void setCreatedate(Date createdate) this.createdate = createdat
8、e; public void addOrderItem(OrderItem orderitem) if (!this.orderItems.contains(orderitem) this.orderItems.add(orderitem); orderitem.setOrder(this); public void removeOrderItem(OrderItem orderitem) if (this.orderItems.contains(orderitem) orderitem.setOrder(null); this.orderItems.remove(orderitem); /*
9、 * 返回对象的散列代码值。该实现根据此对象 * 中 orderid 字段计算散列代码值。 * return 此对象的散列代码值。 */ Override public int hashCode() int hash = 0; hash += (this.orderid != null ? this.orderid.hashCode() : 0); return hash; /* * 确定其他对象是否等于此 Order。当且仅当 * 参数不为 null 且该参数是具有与此对象相同 orderid 字段值的 Order 对象时, * 结果才为 true。 * param 对象,要比较的引用对象
10、* 如果此对象与参数相同,则 return true; * 否则为 false。 */ Override public boolean equals(Object object) if (!(object instanceof Order) return false; Order other = (Order)object; if (this.orderid != other.orderid & (this.orderid = null | !this.orderid.equals(other.orderid) return false; return true; /* * 返回对象的字符串表
11、示法。该实现根据 orderid 字段 * 构造此表示法。 * return 对象的字符串表示法。 */ Override public String toString() return this.getClass().getName()+ orderid= + orderid + ; OrderItem.java: package cn.edu.ejb3.bean;import java.io.Serializable;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persi
12、stence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;Entitypublic class OrderItem implements Serializable private static final long serialVersionUID = -1166337687856636179L; private Integer id; privat
13、e String productname; private Float price; private Order order; public OrderItem() public OrderItem(String productname, Float price) this.productname = productname; this.price = price; Id GeneratedValue public Integer getId() return id; public void setId(Integer id) this.id = id; Column(length=100,
14、nullable=false) 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.REFRESH, optional=false) JoinCol
15、umn(name = order_id) public Order getOrder() return order; public void setOrder(Order order) this.order = order; /* * 返回对象的散列代码值。该实现根据此对象 * 中 id 字段计算散列代码值。 * return 此对象的散列代码值。 */ Override public int hashCode() int hash = 0; hash += (this.id != null ? this.id.hashCode() : super.hashCode(); return has
16、h; /* * 确定其他对象是否等于此 OrderItem。当且仅当 * 参数不为 null 且该参数是具有与此对象相同 id 字段值的 OrderItem 对象时, * 结果才为 true。 * param 对象,要比较的引用对象 * 如果此对象与参数相同,则 return true; * 否则为 false。 */ Override public boolean equals(Object object) if (!(object instanceof OrderItem) return false; OrderItem other = (OrderItem)object; if (thi
17、s.id != other.id & (this.id = null | !this.id.equals(other.id) return false; return true; /* * 返回对象的字符串表示法。该实现根据 id 字段 * 构造此表示法。 * return 对象的字符串表示法。 */ Override public String toString() return this.getClass().getName()+ id= + id + ; b) 设计SessionBean。在cn.edu.ejb3 下设计接口OrderDAO,代码如下:package cn.edu.ejb
18、3;import java.util.List;import cn.edu.ejb3.bean.Order;public interface OrderDAO /* * 添加一个订单 * */ public void insertOrder(Order order); /* * 获取指定订单 * param orderid 订单号 * return */ public Order getOrderByID(Integer orderid); /* * 获取所有订单 * return */ public List getAllOrder();c) 在cn.edu.ejb3.impl 下设计实现类
19、:OrderDAOBean,代码如下:package cn.edu.ejb3.impl;import java.util.List;import javax.ejb.Remote;import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.Query;import cn.edu.ejb3.OrderDAO;import cn.edu.ejb3.bean.Order;StatelessRe
20、mote (OrderDAO.class)public class OrderDAOBean implements OrderDAO PersistenceContext protected EntityManager em; public void insertOrder(Order order) em.persist(order); public Order getOrderByID(Integer orderid) Order order = em.find(Order.class, orderid); order.getOrderItems().size(); /因为是延迟加载,通过执
21、行size()这种方式获取订单下的所有订单项 return order; SuppressWarnings(unchecked) public List getAllOrder() Query query = em.createQuery(select DISTINCT o from Order o inner join fetch o.orderItems order by o.orderid); return (List) query.getResultList(); 8. 添加jar文件,具体操作如图5-8、图5-9所示。图5-8图5-9选择%JBOSS_HOME%client下所有ja
22、r文件,然后单击打开。如图5-10、图5-11所示。图5-10图5-11 注意:把jar文件“mysql-connector-java-5.1.8-bin.jar”放入%JBOSS_HOME%serverdefaultlib下。步骤2:创建客户端1. 右单击package视图空白区域,如图5-12所示,选择【New】-【Web Project】,弹出如图5-13所示窗口,输入项目名称。图5-12图5-132. 右单击项目名“EntityClient”,如图5-14所示,选择【Build Path】-【Configure Build Path】,弹出如图5-15所示窗口。图5-14图5-153.
23、 具体操作如图5-15、图5-16所示。图5-16 4. 在图5-16上单击OK,弹出如图5-17所示窗口。图5-175. 在图5-17上单击OK即可。6. 设计jsp页面,展开EntityClient项目,右单击【WebRoot】,如图5-18所示,选择【New】-【JSP】,弹出图5-19所示窗口。图5-18图5-197. 在图5-19所示窗口输入文件名,单击Finish即可。test.jsp文件内容如下:% try InitialContext ctx = new InitialContext(); OrderDAO orderdao = (OrderDAO) ctx.lookup(Or
24、derDAOBean/remote); Order neworder = new Order(); neworder.setCreatedate(new Date(); neworder.addOrderItem(new OrderItem(笔记本电脑, new Float(13200.5); neworder.addOrderItem(new OrderItem(U盘, new Float(620); neworder.addOrderItem(new OrderItem(台式电脑,new Float(6800.5); neworder.setAmount(new Float(13200.5
25、+620); orderdao.insertOrder(neworder); List list = orderdao.getAllOrder(); for(Order od : list) out.println(=订单号:+ od.getOrderid() +=); for(OrderItem item : od.getOrderItems() out.println(订购产品:+ item.getProductname() +); catch (Exception e) out.println(e.getMessage(); %步骤3:部署数据源,1. 数据源配置文件mysql-ds.xml如下:!- Datasource config
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1