JavaEE之JPA关系操作.docx

上传人:b****8 文档编号:9375171 上传时间:2023-02-04 格式:DOCX 页数:33 大小:626.40KB
下载 相关 举报
JavaEE之JPA关系操作.docx_第1页
第1页 / 共33页
JavaEE之JPA关系操作.docx_第2页
第2页 / 共33页
JavaEE之JPA关系操作.docx_第3页
第3页 / 共33页
JavaEE之JPA关系操作.docx_第4页
第4页 / 共33页
JavaEE之JPA关系操作.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

JavaEE之JPA关系操作.docx

《JavaEE之JPA关系操作.docx》由会员分享,可在线阅读,更多相关《JavaEE之JPA关系操作.docx(33页珍藏版)》请在冰豆网上搜索。

JavaEE之JPA关系操作.docx

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">

java:

/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;

privateSetorderItems=newHashSet();

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")

publicSetgetOrderItems(){

returnorderItems;

}

publicvoidsetOrderItems(SetorderItems){

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对象时,

*结果才为true

*@param对象,要比较的引用对象

*如果此对象与参数相同,则@returntrue

*否则为false

*/

@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对象时,

*结果才为true

*@param对象,要比较的引用对象

*如果此对象与参数相同,则@returntrue

*否则为false

*/

@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

*/

publicListgetAllOrder();

}

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")

publicListgetAllOrder(){

Queryquery=em.createQuery("selectDISTINCTofromOrderoinnerjoinfetcho.orderItemsorderbyo.orderid");

return(List)query.getResultList();

}

}

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);

Listlist=orderdao.getAllOrder();

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$-->

--Datasourceconfig

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1