技术开发 频道

使用 Spring,JSF,EJB3 设计企业应用程序

  开发 JPA Project

  1.新建名称为 simpleJPA 的 JPA 工程,Configuration 为 Default Configuration for JBoss v4.2,选中 Add project to anEAR,如下图:

  图 5. 创建 JPA 项目  

  点击 Next,选择默认,点击完成。

  2.编辑 JPA persistence.xml 文件,内容如下:

  清单 1. JPA persistence.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
  xmlns
="http://java.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">
  <persistence-unit name="simpleJPA">
    
<!-- 使用JBoss默认的数据源 -->
    
<jta-data-source>java:/DefaultDS</jta-data-source>
    
<properties>
      
<!-- 使用Hibernate的hbm2ddl工具在启动时生成表结构 -->
      
<property name="hibernate.hbm2ddl.auto" value="update"/>
      
<!-- 显示最终执行的SQL -->
      
<property name="hibernate.show_sql" value="true" />
      
<!-- 格式化显示的SQL -->
      
<property name="hibernate.format_sql" value="true" />
    
</properties>
  
</persistence-unit>
</persistence>

  persistence-unit 节点可以有一个或多个,每个 persistence-unit 节点定义了持久化内容名称、使用的数据源及持久化产品专有属性。 name 属性定义了 persistence-unit 的名称,该属性是必需的,本例设置的名称为“ simpleJPA ”。

  在 JavaEE 环境中的默认的事务是 JTA,而在 JavaSE 环境中则为 RESOURCE_LOCAL 。使用 指定数据源的 JNDI 名称。 Jboss 数据源的 JNDI 名称在局部命名空间,因此数据源名称前必须带有 java:/ 前缀,数据源名称大小写敏感。在本文中采用 JBoss 容器中默认的数据源,JNDI 为 java:/DefaultDS,详情请查看:[Jboss 安装目录]/server/default/deployhsqldb-ds.xml。

   指定持久化产品的专有属性,各个应用服务器使用的持久化产品都不一样,如 Jboss 使用 Hibernate,weblogic 使用 Kodo(实际上是基于 OpenJPA 的封装),glassfish/sun application server/Oralce 使用 Toplink 。对于 Hibernate 而言,它的 hibernate.hbm2ddl.auto 属性指定实体 Bean 发布时是否同步数据库结构, 如果 hibernate.hbm2ddl.auto 的值设为 create-drop,实体 Bean 发布及卸载时将自动创建及删除相应数据库表(注意:Jboss 服务器启动或关闭时也会引发实体 Bean 的发布及卸载)。 TopLink 产品的 toplink.ddl-generation 属性也起到同样的作用。关于 Hibernate 的可用属性及默认值您可以在 [Jboss 安装目录]\server\default\deploy\ejb3.deployer\META-INF/persistence.properties 文件中找到。在开发阶段,Hibernate 的 hibernate.show_sql 和 hibernate.format_sql 属性特别有用,它们可以格式化显示 Hibernate 执行的 SQL 语句。

  3.新建名称为 org.zhouxing.simple.Product 的 Entity class, 根据示例介绍小节中的 UML 类图添加 Entity Fields,如下图:

  图 6. 新建 Entity class  

  id 为主键,在 EJB3.0 中,每个实体 Bean 必须具有一个主键,主键可以是基本类型,也可以是一个类。主键既作为实体 Bean 在内存中的标识符,也作为数据表中一行的标识符。它在实体 Bean 中是不可缺少的,并且必须是唯一的

  表名为 product。实体 Bean 的成员属性分别映射到 product 表的对应字段。

  4.修改主键的生成方式为自增,给主键添加如下代码: 

@GeneratedValue(strategy = GenerationType.AUTO)

  @javax.persistence.GeneratedValue 注释指定主键值生成方式,该注释与 @Id 注释结合使用在主键属性上。只有在使用持久化驱动生成数据表 schema 时才需指定该注释。如果您的数据表已经存在,那么该注释不需要指定。 strategy() 属性指定字段值生成策略。 GenerationType.AUTO:由容器根据数据库类型选择一种合适的生成方式,这种方式带有随机性,不同的 JPA 实现产品的做法各有不同 (JBoss 将 JPA 实现为 Hibernate),对于本文而言,Hibernate 知道 HSQL 支持 ID 自增长,所以会选择 GenerationType.IDENTITY。

  清单 2. 修改之后的代码

package org.zhouxing.simple;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
Entity implementation class
for Entity: Product
*/
@Entity
@Table(name
= "product")
public class Product implements Serializable {

    @Id
    @GeneratedValue(strategy
= GenerationType.AUTO)
    
private long id;
    
private String name;
    
private String description;
    
private Double price;
    
private Integer inventory;

    
public Product() {
        super();
    }
    ...setters,getters 方法省略
}

  @javax.persistence.Entity 注释指明这是一个实体 Bean,name() 属性指定实体 bean 的名称,在本文中没有为该属性提供取值,默认值为 bean class 的非限定类名。 @javax.persistence.Table 注释指定了实体 Bean 所要映射的表,name() 属性指定映射表的名称。如果缺省 @Table 注释,系统默认采用实体名称作为映射表的名称。在本文中采用的表名为product 。

  至此 JPA Project 完成,接下来是 EJB Project 。

0
相关文章