`

Java EE 5.0 实战教程 第二部分:JPA Entity编程(域建模)

阅读更多

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

 

  1. 根据以下的类图建立域建模,这的模型做了简化,目的是演示Java EE 5.0的开发,若需要更多的功能,读者可根据自己的需要进一步丰富数据模型

  1. Stock.java. 注意Stock.java是一个POJO,也就是最普通的Java类,通过加入@Entity注解使其变成了JPAEntity。详见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;

    }

   

}

 

 

  1. 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;

    }

   

}

 

 

  1. 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;

    }

   

}

 

 

  1. 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;

        }

    }

 

}

 

 

  1. 读者可用拷贝的方式将这四个java类拷到NetBeans里。也可自己输入,NetBeans提供了丰富的编辑功能,象代码自动完成,实体模板及字段封装可帮助你快速地输入源代码。

 

  1. 建立持久性单元。持久性单元是JPA运行环境和物理数据库的连接,一旦指定了持久性单元,JPA运行环境就会自动地在指定的数据库里存储和提取数据。详见Java Persistence API教程。在创建持久性单元时,NetBeans还提供了一个工具,可方便地根据Entities来生成数据库表格,见c

 

  1.  
    1. 右键“StockApp-ejb”,选“新建”-“文件/文件夹…”

 

  1.  
    1. 在对话框里选“持久性”, “持久性单元”,点击“下一步”。

 

  1.  
    1. 在“数据源”一项填入 jdbc/stockDS(注意大小写,和前面必须一致), 并选择“创建”,然后点击“完成”。NetBeans提供了三种表生成策略:

      1. 创建:在部署项目时生成和Entity对印的数据表格

      2. 删除并创建:部署项目时生成表格,并在取消项目部署时删除表格 ,这个选项在开发初期,数据结构改动较多时特别有用。

      3. 无:不进行表格生成的操作。

 

  1. 建立一个会话Bean。这个会话Bean暂时不用,但必须存在,否则下一步部署项目时会出错。

 

  1. 部署项目。右键“StockApp”,选择“部署项目”

 

  1. NetBeans自动部署项目完成后,切换到“运行环境”,展开“数据库”,连接上“…./stockDB”(用户名/密码: stock/stock, 还记得第一部分准备的数据库吗?),打开“表”目录,可看到四个表:Stock, Trade, HoldingTradeType,这是NetBeans根据之前定义的Entities自动生成的。

 

  1. 接下来需要在TRADETYPE表里加入两个常量,可通过NetBeans的数据库工具来完成

    1. 右键“TRADETYPE”,选择“执行命令…”.

 

  1.  
    1. 在打开的“SQL 命令1”窗口里敲入以下命令,并按执行。

insert into tradetype values(1, 'Buy');

 

insert into tradetype values(2, 'Sell');

 

  1.  
    1. 在输出框里,可看见以下输出

0.062 秒内成功执行,但 1 行受到影响。

1 行,第 1

 

0 秒内成功执行,但 1 行受到影响。

3 行,第 1

 

0.062 秒后执行完毕,出现 0 个错误。

 

 

 

  1. 至此,Entity编程完毕,下面我们就可以用这些Entity来编写业务逻辑和页面了。

 

附录

有人会问了,你在这部分里介绍的是先编好JPA Entity然后再根据Entity生成数据库表格,如果我的项目不是新项目,只能使用已有的数据库表格,怎么办呢?别急,NetBeans提供了一个工具,可以根据数据库表格逆向生成JPA Entities。具体做法如下:

  1. 新建一个项目,常规或企业项目均可。

  2. 右键此项目,选择”新建”-“文件/文件夹…”

 

  1. 在对话框里选择“持久性” ,“通过数据库生成实体类”,然后“下一步”

 

  1. 选择你要操作的数据库连接,NetBeans会根据数据库连接提取出可用表,你可全选可用表或者是部分你感兴趣的表,然后“下一步”

 

  1. NetBeans会根据表的名称自动给出实体类名,你可以根据需要做修改。然后指定类生成的位置和包。NetBeans还给一个机会让你创建持久性单元。最后点“完成”,NetBeans就会自动生成实体类。

 

  1. 生成的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;

   

…….

 

分享到:
评论

相关推荐

    Java EE 5.0 教程(chm格式)

    2. **简化EJB(Enterprise JavaBeans)**:EJB 3.0是Java EE 5.0的一部分,大大简化了EJB的使用,特别是引入了无状态会话bean(Stateless Session Beans)和实体bean(Entity Beans,使用JPA管理)的简化模型。...

    Java EE 实战教程

    - **第二部分:JPA Entity编程** - 设计和实现股票投资监控系统的数据模型。 - 使用JPA进行持久化操作,包括实体类定义、查询方法编写等。 - **第三部分:使用JSF & NetBeans Visual Web Pack做页面编程** - ...

    J2EE帮助文档 Java EE 5.0

    虽然JAX-RS是在Java EE 6中正式引入的,但Java EE 5.0的开发者可以通过第三方库如Jersey来实现RESTful服务。 总的来说,Java EE 5.0通过引入更多标准化的组件和简化开发流程,降低了企业级应用开发的复杂性,提高...

    Java EE 5.0 API文档(chm格式)

    Java EE 5.0 API文档是Java企业版(Enterprise Edition)的一个重要组成部分,它提供了详细的接口和类定义,用于开发企业级应用。这个版本的API是针对Java SE 5.0平台设计的,包含了诸如Servlet、JSP、EJB、JMS、JPA...

    Java EE 6企业级应用开发教程:第10章 JPA.ppt

    【Java EE 6企业级应用开发教程:第10章 JPA】 Java Persistence API (JPA) 是Java EE 6中用于对象关系映射(ORM)的重要组件,它提供了一个标准的API,使得开发人员可以方便地将Java对象持久化到关系数据库中,...

    javaee5.0 API文档

    再者,Java Persistence API (JPA) 是Java EE 5.0中处理对象关系映射(ORM)的标准,它允许开发者以面向对象的方式操作数据库。@Entity、@Table、@Column、@Id等注解帮助将Java对象映射到数据库表,而EntityManager...

    经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part1

    经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part1...第二部分详细讲解了JSF RI、EJB 3的Session Bean等Java EE知识;第三部分提供了一个JSF+EJB 3+ JPA整合开发的项目:电子拍卖系统。

    JAVA-EE-api-5.0-中英文对照经理版.chm.7z

    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_EJB3_JPA整合开发.pdf

    内容简介 《经典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企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 part3

    java ee基础使用教程

    Java EE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级Web应用的框架集合,它提供了丰富的服务和组件,使得开发者能够快速开发出分布式、多层架构的应用程序。本教程由知名讲师郑阿奇编著,旨在...

    轻量级Java EE企业应用实战第三版第二章源码

    在《轻量级Java EE企业应用实战第三版》中,第二章主要探讨了Java EE的基础概念和核心组件,以及如何构建轻量级的企业级应用程序。本章源码提供了实际操作的示例,帮助读者深入理解Java EE开发的关键技术。下面我们...

    java_ee_api_中英文对照版

    3. **JPA (Java Persistence API)**:JPA是Java EE 5.0引入的ORM(对象关系映射)标准,允许开发人员以面向对象的方式操作数据库,替代了之前EJB 2.x中的CMP(容器管理持久性)。 4. **JMS (Java Message Service)*...

    Java EE Web编程(Eclipse平台)源文件

    Java EE Web编程是企业级应用开发的重要领域,它基于Java平台,为构建分布式、多层架构的Web应用程序提供了丰富的框架和API。Eclipse作为一款强大的集成开发环境(IDE),广泛用于Java开发,包括Java EE项目。这个...

    Java EE Web编程(Eclipse 平台)

    9. **JPA(Java Persistence API)与Hibernate**:JPA是Java EE中的ORM(对象关系映射)标准,而Hibernate是其流行实现。这部分可能涉及实体类的创建、持久化操作、查询语言(JPQL)等。 10. **JSF(JavaServer ...

    掌握Java持久化的力量:JPA的工作原理及应用

    Java Persistence API (JPA) 是Java EE的一部分,用于实现对象关系映射(ORM),允许开发者以面向对象的方式来操作关系型数据库。JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、持久化上下文...

    JAVA_EE中文API

    这个"JAVA_EE中文API"文档,是Java EE 5.0 API的中文翻译版,对于中国开发者来说,它极大地便利了学习和理解Java EE的相关类库和接口。API文档是开发者的重要参考资料,它详细列出了Java EE 5.0中的所有公共类、接口...

    java EE帮助文档

    2. **JPA(Java Persistence API)**:JPA是Java EE中用于对象关系映射(ORM)的标准,它简化了Java应用程序与数据库之间的交互。通过JPA,开发者可以使用面向对象的方式来操作数据,而无需直接编写SQL语句。 3. **...

Global site tag (gtag.js) - Google Analytics