JavaEE之JPA关系操作.docx
- 文档编号:9375171
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:33
- 大小:626.40KB
JavaEE之JPA关系操作.docx
《JavaEE之JPA关系操作.docx》由会员分享,可在线阅读,更多相关《JavaEE之JPA关系操作.docx(33页珍藏版)》请在冰豆网上搜索。
JavaEE之JPA关系操作
实验5.JPA关系操作
实验内容
建立EJB项目,实现双向1-N关联。
一张订单中存在一个或多个订购项。
One方存在与many方关系定义,而many方也存在与one方关系的定义,这样的关系称为双向关系。
代码上体现为one方有一个集合属性指向many方,而many方也有一个属性指向one方。
建立一个EJB项目,实现上述关系。
生成实体类:
Order(one方)与OrderItem(many方);
实现添加订单功能:
显示订单列表;
删除订单;
修改订单;
建立实体Bean,并生成对实体进行操作的会话Bean,能够完成基本的增删改查操作,编写Web客户端程序进行测试。
实验目的
◆掌握实体类之间的关系的实现;
◆能够通过JPA对具有关系的实体类进行操作;
◆能够对具有关系的实体进行复杂的查询。
实验介绍(整体与本实验)
本试验要求学生已经掌握实体类的生成过程,以及简单Java持久性API的用法。
环境要求
服务器:
Jboss6.0
集成开发环境:
MyEclipse8.6
数据库:
MySql及其驱动程序
实验指导
步骤1:
建立EJB项目,并设计实体Bean、会话Bean
1.建立EJB项目,如图5-1所示。
图5-1
2.输入项目名称,并单击下一步,如图5-2所示。
图5-2
3.设置JPApersistence,完成后单击finsh,如图5-3所示。
图5-3
4.生成项目结构如图5-4所示。
图5-4
5.修改persistence.xm文件,如图5-5、图5-6所示。
图5.5
图5.6
6.persistence.xml文件内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation=" version="1.0"> /MySqlDS --调整JDBC抓取数量的大小: Statement.setFetchSize()--> --调整JDBC批量更新数量--> --显示最终执行的SQL--> --格式化显示的SQL--> 7.在src下建立三个包,结构如图5-7所示。 图5.7 a)在包cn.edu.ejb3.bean下设计两个实体Bean: Order.java、OrderItem.java 代码如下: Order.java: packagecn.edu.ejb3.bean; importjava.io.Serializable; importjava.util.HashSet; importjava.util.Date; importjava.util.Set; importjavax.persistence.CascadeType; importjavax.persistence.Entity; importjavax.persistence.FetchType; importjavax.persistence.GeneratedValue; importjavax.persistence.Id; importjavax.persistence.OneToMany; importjavax.persistence.OrderBy; importjavax.persistence.Table; importjavax.persistence.Temporal; importjavax.persistence.TemporalType; @Entity @Table(name="Orders") publicclassOrderimplementsSerializable{ privatestaticfinallongserialVersionUID=4970325922198249712L; privateIntegerorderid; privateFloatamount; privateSet privateDatecreatedate; @Id @GeneratedValue publicIntegergetOrderid(){ returnorderid; } publicvoidsetOrderid(Integerorderid){ this.orderid=orderid; } publicFloatgetAmount(){ returnamount; } publicvoidsetAmount(Floatamount){ this.amount=amount; } @OneToMany(mappedBy="order",cascade=CascadeType.ALL,fetch=FetchType.LAZY) @OrderBy(value="idASC") publicSet returnorderItems; } publicvoidsetOrderItems(Set this.orderItems=orderItems; } @Temporal(value=TemporalType.TIMESTAMP) publicDategetCreatedate(){ returncreatedate; } publicvoidsetCreatedate(Datecreatedate){ this.createdate=createdate; } publicvoidaddOrderItem(OrderItemorderitem){ if(! this.orderItems.contains(orderitem)){ this.orderItems.add(orderitem); orderitem.setOrder(this); } } publicvoidremoveOrderItem(OrderItemorderitem){ if(this.orderItems.contains(orderitem)){ orderitem.setOrder(null); this.orderItems.remove(orderitem); } } /** *返回对象的散列代码值。 该实现根据此对象 *中orderid字段计算散列代码值。 *@return此对象的散列代码值。 */ @Override publicinthashCode(){ inthash=0; hash+=(this.orderid! =null? this.orderid.hashCode(): 0); returnhash; } /** *确定其他对象是否等于此Order。 当且仅当 *参数不为null且该参数是具有与此对象相同orderid字段值的Order对象时, *结果才为 *@param对象,要比较的引用对象 *如果此对象与参数相同,则@return *否则为 */ @Override publicbooleanequals(Objectobject){ if(! (objectinstanceofOrder)){ returnfalse; } Orderother=(Order)object; if(this.orderid! =other.orderid&&(this.orderid==null||! this.orderid.equals(other.orderid)))returnfalse; returntrue; } /** *返回对象的字符串表示法。 该实现根据orderid字段 *构造此表示法。 *@return对象的字符串表示法。 */ @Override publicStringtoString(){ returnthis.getClass().getName()+"[orderid="+orderid+"]"; } } OrderItem.java: packagecn.edu.ejb3.bean; importjava.io.Serializable; importjavax.persistence.CascadeType; importjavax.persistence.Column; importjavax.persistence.Entity; importjavax.persistence.GeneratedValue; importjavax.persistence.Id; importjavax.persistence.JoinColumn; importjavax.persistence.ManyToOne; @Entity publicclassOrderItemimplementsSerializable{ privatestaticfinallongserialVersionUID=-1166337687856636179L; privateIntegerid; privateStringproductname; privateFloatprice; privateOrderorder; publicOrderItem(){} publicOrderItem(Stringproductname,Floatprice){ this.productname=productname; this.price=price; } @Id @GeneratedValue publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } @Column(length=100,nullable=false) publicStringgetProductname(){ returnproductname; } publicvoidsetProductname(Stringproductname){ this.productname=productname; } publicFloatgetPrice(){ returnprice; } publicvoidsetPrice(Floatprice){ this.price=price; } @ManyToOne(cascade=CascadeType.REFRESH,optional=false) @JoinColumn(name="order_id") publicOrdergetOrder(){ returnorder; } publicvoidsetOrder(Orderorder){ this.order=order; } /** *返回对象的散列代码值。 该实现根据此对象 *中id字段计算散列代码值。 *@return此对象的散列代码值。 */ @Override publicinthashCode(){ inthash=0; hash+=(this.id! =null? this.id.hashCode(): super.hashCode()); returnhash; } /** *确定其他对象是否等于此OrderItem。 当且仅当 *参数不为null且该参数是具有与此对象相同id字段值的OrderItem对象时, *结果才为 *@param对象,要比较的引用对象 *如果此对象与参数相同,则@return *否则为 */ @Override publicbooleanequals(Objectobject){ if(! (objectinstanceofOrderItem)){ returnfalse; } OrderItemother=(OrderItem)object; if(this.id! =other.id&&(this.id==null||! this.id.equals(other.id)))returnfalse; returntrue; } /** *返回对象的字符串表示法。 该实现根据id字段 *构造此表示法。 *@return对象的字符串表示法。 */ @Override publicStringtoString(){ returnthis.getClass().getName()+"[id="+id+"]"; } } b)设计SessionBean。 在cn.edu.ejb3下设计接口OrderDAO,代码如下: packagecn.edu.ejb3; importjava.util.List; importcn.edu.ejb3.bean.Order; publicinterfaceOrderDAO{ /** *添加一个订单 * */ publicvoidinsertOrder(Orderorder); /** *获取指定订单 *@paramorderid订单号 *@return */ publicOrdergetOrderByID(Integerorderid); /** *获取所有订单 *@return */ publicList } c)在cn.edu.ejb3.impl下设计实现类: OrderDAOBean,代码如下: packagecn.edu.ejb3.impl; importjava.util.List; importjavax.ejb.Remote; importjavax.ejb.Stateless; importjavax.persistence.EntityManager; importjavax.persistence.PersistenceContext; importjavax.persistence.Query; importcn.edu.ejb3.OrderDAO; importcn.edu.ejb3.bean.Order; @Stateless @Remote(OrderDAO.class) publicclassOrderDAOBeanimplementsOrderDAO{ @PersistenceContextprotectedEntityManagerem; publicvoidinsertOrder(Orderorder){ em.persist(order); } publicOrdergetOrderByID(Integerorderid){ Orderorder=em.find(Order.class,orderid); order.getOrderItems().size(); //因为是延迟加载,通过执行size()这种方式获取订单下的所有订单项 returnorder; } @SuppressWarnings("unchecked") publicList Queryquery=em.createQuery("selectDISTINCTofromOrderoinnerjoinfetcho.orderItemsorderbyo.orderid"); return(List } } 8.添加jar文件,具体操作如图5-8、图5-9所示。 图5-8 图5-9 选择%JBOSS_HOME%\client下所有jar文件,然后单击打开。 如图5-10、图5-11所示。 图5-10 图5-11 注意: 把jar文件“mysql-connector-java-5.1.8-bin.jar”放入%JBOSS_HOME%\\server\default\lib下。 步骤2: 创建客户端 1.右单击package视图空白区域,如图5-12所示,选择【New】->【WebProject】,弹出如图5-13所示窗口,输入项目名称。 图5-12 图5-13 2.右单击项目名“EntityClient”,如图5-14所示,选择【BuildPath】->【ConfigureBuildPath】,弹出如图5-15所示窗口。 图5-14 图5-15 3.具体操作如图5-15、图5-16所示。 图5-16 4.在图5-16上单击OK,弹出如图5-17所示窗口。 图5-17 5.在图5-17上单击OK即可。 6.设计jsp页面,展开EntityClient项目,右单击【WebRoot】,如图5-18所示,选择【New】->【JSP】,弹出图5-19所示窗口。 图5-18 图5-19 7.在图5-19所示窗口输入文件名,单击Finish即可。 test.jsp文件内容如下: <%@pagecontentType="text/html;charset=GBK"%> <%@pageimport="cn.edu.ejb3.OrderDAO,cn.edu.ejb3.bean.*, javax.naming.*, java.util.*"%> <% try{ InitialContextctx=newInitialContext(); OrderDAOorderdao=(OrderDAO)ctx.lookup("OrderDAOBean/remote"); Orderneworder=newOrder(); neworder.setCreatedate(newDate()); neworder.addOrderItem(newOrderItem("笔记本电脑",newFloat(13200.5))); neworder.addOrderItem(newOrderItem("U盘",newFloat(620))); neworder.addOrderItem(newOrderItem("台式电脑",newFloat(6800.5))); neworder.setAmount(newFloat(13200.5+620)); orderdao.insertOrder(neworder); List for(Orderod: list){ out.println("==============订单号: "+od.getOrderid()+"================= for(OrderItemitem: od.getOrderItems()){ out.println("订购产品: "+item.getProductname()+" } } }catch(Exceptione){ out.println(e.getMessage()); } %> 步骤3: 部署数据源, 1.数据源配置文件mysql-ds.xml如下: xmlversion="1.0"encoding="UTF-8"? > --Seehttp: //www.jboss.org/community/wiki/Multiple1PCforinformationaboutlocal-tx-datasource--> --$Id: mysql-ds.xml975362009-12-0814: 05: 07Zjesper.pedersen$--> --Datasourceconfigtrue
。true
;false
。true
。true
;false
。
");
");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaEE JPA 关系 操作