Java EE 5.0 实战教程 第二部分:JPA Entity编程(域建模)
2008-06-18 10:40:02
查看(
8 ) /
评论(
0 )
域建模是每个面向对象应用程序的核心,就像人的骨骼,如果骨骼都没有,什么界面呀,数据呀都无处可靠。在JPA之前,Java EE程序需要一套域建模,还需要一套类似的Entity Bean来处理Persistence,因为Entity Bean是和EJB容器相关的,不能运用在容器之外,这样就产生了重复,而重复是程序维护的恶梦,每一个改变都需要做多处的修改,一个不小心少改了一个地方就会产生莫名其妙的错误。JPA的出现使这个问题得到解决,JPA里的Entity可以和Persistence Context剥离从而可以象普通的Java类一样使用,详见讲稿Java Persistence API。
-
根据以下的类图建立域建模,这的模型做了简化,目的是演示Java EE 5.0的开发,若需要更多的功能,读者可根据自己的需要进一步丰富数据模型。
-
Stock.java. 注意Stock.java是一个POJO,也就是最普通的Java类,通过加入@Entity注解使其变成了JPA的Entity。详见Java Persistence API教程。
package entities;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Stock implements java.io.Serializable {
@Id private String stockCode;
private String stockName;
/** Creates a new instance of Stock */
public Stock() {
}
public String getStockCode() {
return stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
public String getStockName() {
return stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
}
|
-
Trade.java. 注意Trade类应用了@ManyToOne注解来确定和别的Entity的关系。详见详见Java Persistence API教程。
package entities;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity()
public class Trade implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private Stock stock;
private long shareNum;
private double price;
@ManyToOne
private TradeType type;
/** Creates a new instance of Trade */
public Trade() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Stock getStock() {
return stock;
}
public void setStock(Stock stock) {
this.stock = stock;
}
public long getShareNum() {
return shareNum;
}
public void setShareNum(long shareNum) {
this.shareNum = shareNum;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public TradeType getType() {
return type;
}
public void setType(TradeType type) {
this.type = type;
}
}
|
-
Holding.java.
package entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity()
public class Holding implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToOne
private Stock stock;
private long shareNum;
private double averageCost;
/** Creates a new instance of Holding */
public Holding() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Stock getStock() {
return stock;
}
public void setStock(Stock stock) {
this.stock = stock;
}
public long getShareNum() {
return shareNum;
}
public void setShareNum(long shareNum) {
this.shareNum = shareNum;
}
public double getAverageCost() {
return averageCost;
}
public void setAverageCost(double averageCost) {
this.averageCost = averageCost;
}
}
|
-
TradeType.java.
package entities;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity()
public class TradeType implements java.io.Serializable {
@Id
private int typeCode;
private String description;
public TradeType() {
}
public TradeType(int code) {
this.typeCode = code;
}
public TradeType(int code, String description){
this.setTypeCode(code);
this.setDescription(description);
}
public static TradeType BUY = new TradeType(1, "Buy");
public static TradeType SELL = new TradeType(2, "Sell");
public int getTypeCode() {
return typeCode;
}
public void setTypeCode(int typeCode) {
this.typeCode = typeCode;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean equals(Object obj) {
if(!(obj instanceof TradeType)){
return false;
}
TradeType theType = (TradeType) obj;
if(theType.getTypeCode() == getTypeCode()){
return true;
} else {
return false;
}
}
}
|
-
读者可用拷贝的方式将这四个java类拷到NetBeans里。也可自己输入,NetBeans提供了丰富的编辑功能,象代码自动完成,实体模板及字段封装可帮助你快速地输入源代码。
-
建立持久性单元。持久性单元是JPA运行环境和物理数据库的连接,一旦指定了持久性单元,JPA运行环境就会自动地在指定的数据库里存储和提取数据。详见Java Persistence API教程。在创建持久性单元时,NetBeans还提供了一个工具,可方便地根据Entities来生成数据库表格,见c
-
-
右键“StockApp-ejb”,选“新建”-“文件/文件夹…”
-
-
在对话框里选“持久性”, “持久性单元”,点击“下一步”。
-
-
在“数据源”一项填入 jdbc/stockDS(注意大小写,和前面必须一致), 并选择“创建”,然后点击“完成”。NetBeans提供了三种表生成策略:
-
创建:在部署项目时生成和Entity对印的数据表格
-
删除并创建:部署项目时生成表格,并在取消项目部署时删除表格 ,这个选项在开发初期,数据结构改动较多时特别有用。
-
无:不进行表格生成的操作。
-
建立一个会话Bean。这个会话Bean暂时不用,但必须存在,否则下一步部署项目时会出错。
-
部署项目。右键“StockApp”,选择“部署项目”。
-
NetBeans自动部署项目完成后,切换到“运行环境”,展开“数据库”,连接上“…./stockDB”(用户名/密码: stock/stock, 还记得第一部分准备的数据库吗?),打开“表”目录,可看到四个表:Stock, Trade, Holding和TradeType,这是NetBeans根据之前定义的Entities自动生成的。
-
接下来需要在TRADETYPE表里加入两个常量,可通过NetBeans的数据库工具来完成。
-
右键“TRADETYPE”,选择“执行命令…”.
-
-
在打开的“SQL 命令1”窗口里敲入以下命令,并按执行。
insert into tradetype values(1, 'Buy');
insert into tradetype values(2, 'Sell');
|
-
-
在输出框里,可看见以下输出
在 0.062 秒内成功执行,但 1 行受到影响。
第 1 行,第 1 列
在 0 秒内成功执行,但 1 行受到影响。
第 3 行,第 1 列
0.062 秒后执行完毕,出现 0 个错误。
|
-
至此,Entity编程完毕,下面我们就可以用这些Entity来编写业务逻辑和页面了。
附录
有人会问了,你在这部分里介绍的是先编好JPA Entity然后再根据Entity生成数据库表格,如果我的项目不是新项目,只能使用已有的数据库表格,怎么办呢?别急,NetBeans提供了一个工具,可以根据数据库表格逆向生成JPA Entities。具体做法如下:
-
新建一个项目,常规或企业项目均可。
-
右键此项目,选择”新建”-“文件/文件夹…”
-
在对话框里选择“持久性” ,“通过数据库生成实体类”,然后“下一步”
-
选择你要操作的数据库连接,NetBeans会根据数据库连接提取出可用表,你可全选可用表或者是部分你感兴趣的表,然后“下一步”
-
NetBeans会根据表的名称自动给出实体类名,你可以根据需要做修改。然后指定类生成的位置和包。NetBeans还给一个机会让你创建持久性单元。最后点“完成”,NetBeans就会自动生成实体类。
-
生成的Trade.java的例子。看起来比我们自己编的还好,连NamedQuery都给做好了,注解的运用也规范多了。
…….
@Entity
@Table(name = "TRADE")
@NamedQueries( {
@NamedQuery(name = "Trade.findById", query = "SELECT t FROM Trade t WHERE t.id = :id"),
@NamedQuery(name = "Trade.findByPrice", query = "SELECT t FROM Trade t WHERE t.price = :price"),
@NamedQuery(name = "Trade.findByTradingdate", query = "SELECT t FROM Trade t WHERE t.tradingdate = :tradingdate"),
@NamedQuery(name = "Trade.findBySharenum", query = "SELECT t FROM Trade t WHERE t.sharenum = :sharenum")
})
public class Trade implements Serializable {
@Id
@Column(name = "ID", nullable = false)
private BigInteger id;
@Column(name = "PRICE")
private Double price;
@Column(name = "TRADINGDATE")
@Temporal(TemporalType.DATE)
private Date tradingdate;
@Column(name = "SHARENUM")
private BigInteger sharenum;
@JoinColumn(name = "STOCK_STOCKCODE", referencedColumnName = "STOCKCODE")
@ManyToOne
private Stock stockStockcode;
@JoinColumn(name = "TYPE_TYPECODE", referencedColumnName = "TYPECODE")
@ManyToOne
private Tradetype typeTypecode;
…….
|
分享到:
相关推荐
2. **简化EJB(Enterprise JavaBeans)**:EJB 3.0是Java EE 5.0的一部分,大大简化了EJB的使用,特别是引入了无状态会话bean(Stateless Session Beans)和实体bean(Entity Beans,使用JPA管理)的简化模型。...
- **第二部分:JPA Entity编程** - 设计和实现股票投资监控系统的数据模型。 - 使用JPA进行持久化操作,包括实体类定义、查询方法编写等。 - **第三部分:使用JSF & NetBeans Visual Web Pack做页面编程** - ...
虽然JAX-RS是在Java EE 6中正式引入的,但Java EE 5.0的开发者可以通过第三方库如Jersey来实现RESTful服务。 总的来说,Java EE 5.0通过引入更多标准化的组件和简化开发流程,降低了企业级应用开发的复杂性,提高...
Java EE 5.0 API文档是Java企业版(Enterprise Edition)的一个重要组成部分,它提供了详细的接口和类定义,用于开发企业级应用。这个版本的API是针对Java SE 5.0平台设计的,包含了诸如Servlet、JSP、EJB、JMS、JPA...
【Java EE 6企业级应用开发教程:第10章 JPA】 Java Persistence API (JPA) 是Java EE 6中用于对象关系映射(ORM)的重要组件,它提供了一个标准的API,使得开发人员可以方便地将Java对象持久化到关系数据库中,...
再者,Java Persistence API (JPA) 是Java EE 5.0中处理对象关系映射(ORM)的标准,它允许开发者以面向对象的方式操作数据库。@Entity、@Table、@Column、@Id等注解帮助将Java对象映射到数据库表,而EntityManager...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part1...第二部分详细讲解了JSF RI、EJB 3的Session Bean等Java EE知识;第三部分提供了一个JSF+EJB 3+ JPA整合开发的项目:电子拍卖系统。
Java EE 5.0引入了EJB 3.0,大大简化了EJB的开发,通过实体Bean(Entity Beans)、会话Bean(Session Beans)和消息驱动Bean(Message-Driven Beans)来处理业务逻辑。 7. **JPA(Java Persistence API)**:JPA是...
内容简介 《经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发》...第二部分详细讲解了JSF RI、EJB 3的Session Bean等Java EE知识;第三部分提供了一个JSF+EJB 3+ JPA整合开发的项目:电子拍卖系统。
经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 part3
Java EE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级Web应用的框架集合,它提供了丰富的服务和组件,使得开发者能够快速开发出分布式、多层架构的应用程序。本教程由知名讲师郑阿奇编著,旨在...
在《轻量级Java EE企业应用实战第三版》中,第二章主要探讨了Java EE的基础概念和核心组件,以及如何构建轻量级的企业级应用程序。本章源码提供了实际操作的示例,帮助读者深入理解Java EE开发的关键技术。下面我们...
3. **JPA (Java Persistence API)**:JPA是Java EE 5.0引入的ORM(对象关系映射)标准,允许开发人员以面向对象的方式操作数据库,替代了之前EJB 2.x中的CMP(容器管理持久性)。 4. **JMS (Java Message Service)*...
Java EE Web编程是企业级应用开发的重要领域,它基于Java平台,为构建分布式、多层架构的Web应用程序提供了丰富的框架和API。Eclipse作为一款强大的集成开发环境(IDE),广泛用于Java开发,包括Java EE项目。这个...
9. **JPA(Java Persistence API)与Hibernate**:JPA是Java EE中的ORM(对象关系映射)标准,而Hibernate是其流行实现。这部分可能涉及实体类的创建、持久化操作、查询语言(JPQL)等。 10. **JSF(JavaServer ...
Java Persistence API (JPA) 是Java EE的一部分,用于实现对象关系映射(ORM),允许开发者以面向对象的方式来操作关系型数据库。JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、持久化上下文...
这个"JAVA_EE中文API"文档,是Java EE 5.0 API的中文翻译版,对于中国开发者来说,它极大地便利了学习和理解Java EE的相关类库和接口。API文档是开发者的重要参考资料,它详细列出了Java EE 5.0中的所有公共类、接口...
2. **JPA(Java Persistence API)**:JPA是Java EE中用于对象关系映射(ORM)的标准,它简化了Java应用程序与数据库之间的交互。通过JPA,开发者可以使用面向对象的方式来操作数据,而无需直接编写SQL语句。 3. **...