实验5.JPA关系操作 实验内容 建立EB项目,实现双向1-N关联。一张订单中存在一个或多个订购项。Oe方存在 与ma 方关系定义,而may方也存在与o方关系的定义,这样的关系称为双向关系 代码上体现为one方有一个集合属性指向may方,而many方也有一个属性指向one方。 建立一个EJB项目,实现上述关系。 生成实体类:Order(one方)与Orderltem(many方): 实现添加订单功能: 显示订单列表: 刑除订单 修改订单: 建立实体Bean,并生成对实体进行操作的会话Bean,能够完成基本的增删改查操作, 编写Wb客户端程序进行测试。 实验目的 ◆掌握实体类之间的关系的实现: ◆能够通过JPA对具有关系的实体类进行操作 ◆能够对具有关系的实体进行复杂的查询。 实验介绍(整体与本实验) 本试验要求学生已经掌握实体类的生成过程,以及简单Java持久性API的用法。 环境要求 服务器:Jb0s6.0 集成开发环培,vEclinse&6 数据库:MSql及其驱动程序 实验指导 步臻I1:建立EJB项目,并设计实体Bean、会话Bean 1.建立EB项目,如图5-1所示
实验 5. JPA 关系操作 实验内容 建立 EJB 项目,实现双向 1-N 关联。一张订单中存在一个或多个订购项。One 方存在 与 many 方关系定义,而 many 方也存在与 one 方关系的定义,这样的关系称为双向关系。 代码上体现为 one 方有一个集合属性指向 many 方,而 many 方也有一个属性指向 one 方。 建立一个 EJB 项目,实现上述关系。 生成实体类:Order(one 方)与 OrderItem(many 方); 实现添加订单功能: 显示订单列表; 删除订单; 修改订单; 建立实体 Bean,并生成对实体进行操作的会话 Bean,能够完成基本的增删改查操作, 编写 Web 客户端程序进行测试。 实验目的 ◆ 掌握实体类之间的关系的实现; ◆ 能够通过 JPA 对具有关系的实体类进行操作; ◆ 能够对具有关系的实体进行复杂的查询。 实验介绍(整体与本实验) 本试验要求学生已经掌握实体类的生成过程,以及简单 Java 持久性 API 的用法。 环境要求 服务器:Jboss 6.0 集成开发环境: MyEclipse8.6 数据库:MySql 及其驱动程序 实验指导 步骤 1:建立 EJB 项目,并设计实体 Bean、会话 Bean 1. 建立 EJB 项目,如图 5-1 所示
Yeb Project Web Service Project Shog In AlttShiftt Java Project Report Web Project Copy Curl+C Project.. opy Qualified Name Paste Ctrl+V 的Package 卫1et GClass Delete Import. ☑xp2rt. Refresh F5 File A Applet 图5-1 2.输入项目名称,并单击下一步,如图5-2所示。 回Now EJB Project 回 Create an EJB Project Create an EJB project in the workspace or an external location EJB Project Dails Project Nome:EntityTest2 Location: ☑Use default location Directory:E:\workspace pkEntityTest2 Brovse. Source folder:rc Java EE5.0-EB3.0 OJ2E1.4-B2.1 ○J2E1.3-JB2.0 Persistence Configuration VAdd support for Entity beans (add JPA capabilities) ities to this project <Back Next)Einish☐Cancel 图5-2 设置PA persistence,.完成后单击finsh,如图5-3所示
图 5-1 2. 输入项目名称,并单击下一步,如图 5-2 所示。 图 5-2 3. 设置 JPA persistence,完成后单击 finsh,如图 5-3 所示
回New EJB Project 回 Create an EJB Project 入① 下Persi是De Persistence Unit Name:EntityTest2PU JNDI Data Source: ☑Use Java Transaction Design-time Persistence Tools Configuration Specify JPA Datasource details Driver Croate new Driver 习Update List vith 10 〈aek☐ext>☐Einish☐Cancel☐ 图5-3 4.生成项目结构如图5-4所示。 日年可 sre Java EE 5 Libraries 子 图5-4
图 5-3 4. 生成项目结构如图 5-4 所示。 图 5-4
5.修改persistence.xm文件,如图5-5、图5-6所示 父peristence,xnl3 日 EntityTest2/sre/META-TNE/persistence.x1g-g> persistence xmlns-Whttp://java.sun.com/xml/ns/persistence" http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"ver Desic Source 图5.5 *ttp: 200 的 dd 图56 6 persistence.xm文件内容如下:
5. 修改 persistence.xm 文件,如图 5-5、图 5-6 所示。 图 5.5 图 5.6 6. persistence.xml 文件内容如下:
kpersistence xmlns-"http://iava.sun.com/xml/ns/persistence' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation-"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence 1 0.xsd version="1.0"> Kpersistence-unit nape"EntityrestPU transaction typeTA java:/My: persistence> 7.在s心下建立三个包,结构如图5-7所示 用Packa Hiara口日 4巴EntityTest2 由cn.edu.ejb3.ipl ETA-I证 图5.7 a)在包cn.edu.ejb3.bean下设计两个实体Bean:Order.java、Orderltem.java 代码如下:
java:/MySqlDS 7. 在 src 下建立三个包,结构如图 5-7 所示。 图 5.7 a) 在包 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: importjava.util.Set. import javax.persistence.Cascade Type. import iavax.persistence.Entitv: import javax.persistence.FetchTvpe import javax import javax.persistence.One ToMany. import javax.persistence.OrderBy: import javax.persistence.Table; import javax-persistence.Temporal. impor TemporalType @Entity @Table(name="Orders") public class Order implements Serializable private static final long serialVersionUID=4970325922198249712L private Integer orderid. private Float amount: private Setorderltems=new HashSet(). @Id @Generated Value public Integer getOrderid() returnorderid; public void setOrderid(nteger orderid) this.orderid orderid; public Float getAmount({ return amount. public void setAmount(Float amount){ this amount amount:
Order.java: package cn.edu.ejb3.bean; import java.io.Serializable; import java.util.HashSet; import java.util.Date; 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; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @Table(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; @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 @OrderBy(value="idASC") public SetgetOrderltems) return orderltems. public void setOrderltems(SetOrderItem>orderItems) this orderltems=orderltems, @Temporal(value=TemporalType TIMESTAMP) public Date getCreatedate return createdate public void setCreatedate Date createdate) this.createdate createdate: public void addOrderltem(Orderltem orderitem) if(!this orderltems.contains(orderitem)) thisorderltems add(orderitem); orderitem.setOrder(this) public void removeOrderltem(Orderltem orderitem) if (this orderltems containsorderitem)){ orderitem.setOrder(ul) (orderitem) 体幸 ·返回对象的散列代码值。该实现根据此对象 幸中orderid字段计算散列代码值, ◆@return此对象的散列代码值。 @Override public int hashCode() int hash=0 hash +=(this.orderid !null this.orderid.hashCode():0): return hash;
@OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY) @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 = createdate; } 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); } } /** * 返回对象的散列代码值。该实现根据此对象 * 中 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对象,要比较的引用对象 幸如果此对象与参数相同,则@returntruc: ◆否则为 @Override public boolean equals(Object object) if((object instanceofOrder)) retum false. Order other=(Order)object, if (this.orderid I=other.orderid&&(this.orderid =null Ithis.orderidcqualsohcrordcrid》rctumfalsc return true /** ·返回对象的字符串表示法。该实现根据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 importjavax.persistence.Column; mport javax.persistence.Entity import javax.persistence.Id; import javax.persistence.JoinColumn import javax.persistence.Many ToOne
/** * 确定其他对象是否等于此 Order。当且仅当 * 参数不为 null 且该参数是具有与此对象相同 orderid 字段值的 Order 对 象时, * 结果才为 true。 * @param 对象,要比较的引用对象 * 如果此对象与参数相同,则 @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; } /** * 返回对象的字符串表示法。该实现根据 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.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne;
@Entity public class Orderltem implements Serializable private static final long serialVersionUID=-1166337687856636179L private Integer id: private String productname. private Float price private Order order. public Orderltem() public Orderltem(String productname,Float price) thisproductname=productname. this.price=price. QId agenerated value public Integer getld( return id. public void setld(Integer id) this.id=id; @Column(length=100.nullable=false) public String getProductname(){ return productname: } public void setProductname(String productname) this.productname productname; public Float getPrice retur price public void setPrice(Float price) this.priceprice: @ManyToOne(cascade-Cascade Type.REFRESH,optional=false) @JoinColumn(name ="order id") public Order getorder() return order;
@Entity public class OrderItem implements Serializable { private static final long serialVersionUID = -1166337687856636179L; 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 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(length=100, 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) @JoinColumn(name = "order_id") public Order getOrder() { return order;
public cvoid setOrder(Orderorder) this.order order; /体本 返回对象的散列代码值。该实现根据此对象 中id字 计算散列代码值 ◆@return此对象的散列代码值。 @Override publie int hashCode() int hash=0. hash+=(this.id!=null ?this.id.hashCode(:super.hashCode(); return hash: ·确定其他对象是否等于此Orderltem。当且仅当 幸参数不为null且该参数是具有与此对象相同id字段值的Orderltem对象时, ◆结果才为true。 ·@param对象,要比较的引用对象 幸如果此对象与参数相同,则@returntrue: 否则为false @Override public boolean equals(Object object) if(!(objec t instanceof Orderltem)) retur false Orderltem other =(Orderltem)object if(this.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+"]
} 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 hash; } /** * 确定其他对象是否等于此 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 (this.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 + "]"; }