在EJB 2.x中。EJB有3种类型的Bean。各自是会话Bean(Session Bean)、消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean)。

随着EJB 3的推出,EJB2.x中的实体Bean逐渐被JPA规范所替代,JPA不仅能在EJB环境中使用,并且能在Java SE、Java EE环境中使用。相对于EJB 2.x中的实体Bean,它的使用范围更广。

但这里我们仍然将其称做实体Bean。



        与会话Bean和消息驱动Bean类似,新的实体Bean也是一个加了凝视符(@Entity)的简单Java对象(POJO),实体关系和O/R映射也是通过凝视符来定义的,并提供几种不同的数据库操作规范。

一旦被EntityManager訪问,它就成为了一个持久化对象。而且成为了持久化上下文的一部分。此时我们就能够像使用Hibernate、iBATIS、MYBATIS一样来使用实体对象了。

本文主要将具体解说实体Bean的开发技术。

1、建立与数据库的连接,演示实体Bean的开发与调用过程。

2、实体管理器:运行数据库更新的方法。

3、生命周期:实体Bean的监听和回调。

4、关系实体映射:开发实体的方法。

5、JPQL查询语言:运行数据库实体查询。

6、原生SQL查询:运行原生SQL语句。

它们之间的关系如图所看到的,通过实体管理器操作实体Bean。来实现对数据库的更新、JPQL查询和原生SQL查询。

实体管理器是工具。实体Bean是数据。

以下首先来解说实体Bean的调用过程。然后通过开发第一个实体Bean。演示该配置与开发的过程,包含以下内容:

1、配置数据源。

2、指定数据源。

3、开发第一个实体Bean--Student.java。

4、开发会话Bean进行调用--StudentDAORemote.java和StudentDAO.java。

5、打包并部署到JBossserver。

6、开发client进行測试--StudentDAOClient.java。

终于实现,通过实体Bean的建立与MySQL数据库的连接。往数据表中插入一条记录。

一、实体Bean的工作原理

实体Bean是作为持久化类被EJB容器管理的,要实现对该持久化类的调用,必须经过下面步骤。

(1)配置数据源连接。

(2)在配置文件persistence.xml中指定数据源。

(3)开发实体Bean。

(4)在会话Bean、Java SE或Java EE中调用实体Bean。


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb2xpamluZzIwMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

        实体Bean不仅能够被会话Bean调用。还能够被不论什么的Java类、JSP和Servlet调用,调用的目的是实现对数据库的操作。它的意义与Hibernate、iBATIS全然同样。就是作为系统的DAO层,实现对数据库的訪问。

        以下我们就依照从底层到上层的顺序,来演示创建与数据库的连接的过程。


二、配置数据源


jndi-name:指定JNDI命名。

connection-url:数据库连接URL。

driver:数据库驱动类。

user-name:数据库登录username。

password:数据库登陆password。

我们仅仅须要通过引用JNDI命令KsMysqlDS来引用该数据源。引用的方法非常easy。仅仅须要在persistence.xml中指定该别名就可以



三、指定数据源--persistence.xml
以上配置的数据源由JBossserver载入和管理。要使用这些数据源,还须要在我们的应用中指定引用哪一个数据源。引用的方法非常easy,仅仅须要在应用的/项目/META-INF文件夹下加入一个配置文件persistence.xml就可以。并在该文件里指定引用的数据源JNDI名称,同一时候能够设置该数据源的相关操作属性。

配置文件persistence.xml





当中包括3个配置元素,分别例如以下。

persistence-unit元素:能够有一个或多个。每一个persistence-unit元素定义了持久化内容名称、使用的数据源名称及Hibernate属性。当中的name属性用于设置持久化名称。

jta-data-source元素:用于指定实体Bean使用的数据源名称KsMysqlDS。当指定数据源名称时java:/前缀不能缺少,并注意数据源名称的大写和小写。

properties元素:用于指定Hibernate的各项属性。假设hibernate.hbm2ddl.auto的值设为update,这样实体Bean加入一个属性时能同一时候在数据表添加对应字段。

(1)properties元素属性在各个应用server使用的持久化产品中都不一样。如JBoss使用Hibernate。WebLogic10使用Kodo,GlassFish/Sun Application Server/Oralce使用Toplink。

(2)JBossserver在启动或关闭时会引发实体Bean的公布及卸载。


四、开发第一个实体
实体Bean实际上相应了数据库中的表,它是数据库中表在Java类中的表现,通常为最普通的POJO类。EJB容器可以依据实体Bean自己主动在数据库中创建数据表,这就须要将实体类与数据表的结构进行相应,包含表名、字段名、字段长度、字段类型、主键等信息。

为了开发一个与数据库表相应的单表实体Bean,我们首先设计一个学生表student的数据结构,该表共包含7个字段。如表6-1所看到的。

学生表student
当中的字段类型相应了MySQL数据库中的字段类型,Java类型为相应的POJO类中的字段类型,即实体Bean中的变量类型。

要开发一个与该表相应的实体Bean非常easy,仅仅须要新建一个POJO类,加入7个与表的字段同名的变量。同一时候使用一些凝视符来表示该实体Bean与数据表student的相应映射关系就可以。

Bean类Student.java。首先我们来看看这个完整的实体类的代码,例如以下所看到的:


实体Bean类Student.java

package com.ejb.entitybean;  

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; @SuppressWarnings("serial")
@Entity
@Table(name = "Student")
public class Student implements Serializable {
private Integer studentid; //学号
private String name; //姓名
private boolean sex; //性别
private Short age; //年龄
private Date birthday; //出生日期
private String address; //地址
private String telephone //电话 @Id
@GeneratedValue
public Integer getStudentid() {
return studentid;
} public void setStudentid(Integer studentid) {
this.studentid = studentid;
} @Column(name = "name", length = 50)
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Column(nullable = false)
public boolean getSex() {
return sex;
} public void setSex(boolean sex) {
this.sex = sex;
} @Column(nullable = false)
public Short getAge() {
return age;
} public void setAge(Short age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Column(name = "address", length = 100)
public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Column(name = "telephone", length = 20)
public String getTelephone() {
return telephone;
} public void setTelephone(String telephone) {
this.telephone = telephone;
}
}

实体Bean通常须要实现Serializable接口。这样就能够有EJBclient创建该对象,并将该对象传送到服务端,否则将引发java.io.InvalidClassException例外。

该类是一个Java POJO类,当中包括了7个变量,并为每一个变量加入了getter/setter函数。

为了将该POJO类表现为一个实体Bean,加入了一些凝视符。来与数据表student进行相应。这些凝视例如以下。

@Entity凝视指明这是一个实体Bean,每一个实体Bean类映射数据库中的一个表。

@Table凝视的name属性指定映射的数据表名称,Student类映射的数据表为Student。

@Column凝视定义了映射到列的全部属性,如列名是否唯一,是否同意为空,是否同意更新等,其属性介绍例如以下。

name:映射的列名。如映射Student表的name列,能够在name属性的getName()方法上面增加@Column(name = "name"),假设不指定映射列名,则容器会将属性名称作为默认的映射列名。

unique:是否唯一。

nullable:是否同意为空。

length:对于字符型列,length属性指定列的最大字符长度。

insertable:是否同意插入。

updatable:是否同意更新。

columnDefinition:定义建表时创建此列的DDL。

secondaryTable:从表名。假设此列不建在主表上(默认建在主表上),则该属性定义该列所在的从表的名字。

@Lob凝视指定某一个字段为大的文本字段类型。

@Id凝视指定studentid属性为表的主键。

@GeneratedValue凝视定义了标识字段的生成方式,本例中的studentid的值由MySQL数据库自己主动生成。它能够有下面多种生成方式。

TABLE:容器指定用底层的数据表确保唯一。

SEQUENCE:使用数据库的SEQUENCE 列来保证唯一。

IDENTITY:使用数据库的INDENTIT列来保证唯一。

AUTO:由容器挑选一个合适的方式来保证唯一。

NONE:容器不负责主键的生成,由调用程序来完毕。



比如:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return this.id;
}

这样就开发完实体Bean了。它除了在POJO上加入了一些凝视外。与普通的POJO类没有不论什么差别。


五、开发会话Bean进行调用

1、开发会话Bean进行调用--StudentDAORemote.java和StudentDAO.java       。

以下我们来开发一个远程的会话Bean组件,通过调用实体Bean类Student.java,来实现往数据表student中插入一条记录。

        首先在项目EntityBeanTest中新建一个包com.ejb.dao,然后依照会话Bean的开发方法。在该包中新建一个远程的会话Bean组件StudentDAO。新建完后会产生一个远程接口类StudentDAORemote.java和实现类StudentDAO.java。

1)远程接口类StudentDAORemote.java

通过凝视符@Remote进行标识。

函数insert()运行插入student功能

远程接口类StudentDAORemote.java

<span style="font-family:SimSun;">package com.ejb.dao;  

import java.util.List;
import javax.ejb.Remote;
import com.ejb.entitybean.Student; @Remote
public interface StudentDAORemote {
public boolean insert(Student student);
} </span>

2)实现类StudentDAO.java

        实现了远程接口StudentDAORemote.java,并通过@Stateless标识为无状态会话Bean。

首先它包括了一个EntityManager类型的变量em。EntityManager是实体管理器。顾名思义。它是实体Bean的管理容器。通过该对象,我们可以实现与数据库的各种交互,包括增、删、改、查等。

        该实体变量em还通过凝视@PersistenceContext来实现动态注入EntityManager对象,假设persistence.xml文件里配置了多个不同的持久化内容。则还须要指定持久化名称注入EntityManager 对象,能够通过@PersistenceContext凝视的unitName属性进行指定,比如:

@PersistenceContext(unitName="exam-entity")
EntityManager em;

假设仅仅有一个持久化内容配置。则不须要明白指定。

        然后开发该类实现接口中的函数insert(),仅仅须要调用em的persist()函数。就行将Student对象持久化到数据库中。即往数据库中新增一条记录。

实现类StudentDAO.java

package com.ejb.dao;  

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import com.ejb.entitybean.Student; @Stateless
public class StudentDAO implements StudentDAORemote {
@PersistenceContext
protected EntityManager em; public boolean insert(Student student) {
try {
em.persist(student);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}

六、打包并部署到JBOSSserver

打成jar包并部署到JBossserver。JBossserver就会自己主动载入该服务。形成JNDI服务供外部訪问了。

该公布步骤例如以下:

1、载入persistence.xml文件。

2、创建数据库表student,此时查看MySQL数据库就会看到新建的表student。

3、公布JNDI服务StudentDAO/remote。

这样我们就能够通过client訪问JNDI服务StudentDAO/remote了。

七、开发client进行測试-StudentDAOClient.java

        开发client进行測试--StudentDAOClient.java
        以上我们开发了实体Bean和会话Bean组件,并公布到了JBossserver中,以下我们来开发一个Javaclient程序,在该client创建一个实体对象,然后调用会话Bean组件插入该对象,往数据表中插入一条记录。

首先将实体类Student.java和接口类StudentDAORemote.java复制加入到測试项目EJBTestJava的相应包中,然后新建測试类



測试类StudentDAOClient.java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Properties; import javax.naming.InitialContext;
import javax.naming.NamingException; import com.ejb.dao.StudentDAORemote;
import com.ejb.entitybean.Student; public class StudentDAOClient {
public static void main(String[] args) throws NamingException {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
try {
InitialContext ctx = new InitialContext(props);
StudentDAORemote studentDAO = (StudentDAORemote) ctx.lookup("StudentDAO/remote"); Student student = new Student();
student.setName("刘中兵");
student.setSex(true);
student.setAge((short)25);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
student.setBirthday(format.parse("1981-05-04"));
student.setTelephone("12345678");
student.setAddress("北京"); studentDAO.insert(student);
System.out.println("已经插入一个学生记录!"); } catch (NamingException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}

该类通过訪问远程JNDI服务StudentDAO/remote,取得了远程会话Bean实例studentDAO。然后创建了一个Student实体对象。调用insert()函数插入该对象。

执行该程序后,会在控制台中输出例如以下信息:

        已经插入一个学生记录!

        这就表明client的Java类已正确地将Student对象提交到远程会话Bean组件中了。

        经过第一次载入后的实体Bean对象已经被实体管理器EntityManager缓存了,再次訪问时,就会直接从缓存中取得该实体对象。


持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接的更多相关文章

  1. ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口

    引言 前边两篇博客介绍了Web API的基本框架以及路由配置,这篇博客主要解决在前后端分离项目中,为前端人员提供详细接口说明的问题,主要是通过修改WebApi HelpPage相关代码和添加WebAp ...

  2. Spring Data Jpa系列教程--------实体解析和关联关系

    Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...

  3. 022年9月12日 学习ASP.NET Core Blazor编程系列三——实体

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  4. SpringData系列三 Repository Bean 方法定义规范

    本节主要介绍Repository Bean中方法定义规范. 1.方法不是随便声明,需要符合一定的规范. 2.按照Spring Data的规范,查询方法以find|read|get开头,涉及条件查询时, ...

  5. HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)

    各浏览器对编码格式的支持情况 audio和video元素的属性介绍 1.src:媒体数据的URL地址 <video src="pr6.mp4"></video&g ...

  6. EJB_开发单表映射的实体bean

    开发单表映射的实体bean 实体bean 它属于java持久化规范(JPA)里的技术,实体bean通过元数据在Javabean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对 ...

  7. Web 开发人员和设计师必读文章推荐【系列三十】

    <Web 前端开发精华文章推荐>2014年第9期(总第30期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  8. 69. JPA实体Bean的生命周期【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 在使用JPA的时候,如果对bean的生命周期不了解的话,难免会碰到一些问题,比如:InvalidDataAccessApiUsageExcepti ...

  9. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

随机推荐

  1. Linux下解决高并发socket最大连接数所受的各种限制(解除IO限制)

    linux作为服务器系统,当运行高并发TCP程序时,通常会出现连接建立到一定个数后不能再建立连接的情况 本人在工作时,测试高并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建立到3800左 ...

  2. Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view...

    Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tabl ...

  3. Oracle的卸载与安装

    今天在做一个CURD的web小应用,为后面使用ExtJS搭建一个后台.因为还没有使用过Oracle数据库,因此今天也特的地的使用oracle数据库作为后台的数据库,也当练习使用oracle. 但是今天 ...

  4. 动态内存分配(new)和释放(delete)

    在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了.但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入 ...

  5. Phalcon处理404页面的 Ruter 方法

    /** * Initializes the router * * @param array $options */ protected function initRouter($options = a ...

  6. Aptana Studio 快捷键

    窗口 Ctrl+ Shift +L 调出快捷键提示 Ctrl+ W 关闭当前标签窗口 Ctrl+ Shift + W 关闭当前标签窗口 Ctrl+ F6 (或者是Aptana的Ctrl+Tab )下一 ...

  7. IOS中扩展机制Category和associative

    在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法.一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还 ...

  8. Linux socket编程 DNS查询IP地址

    本来是一次计算机网络的实验,但是还没有完全写好,DNS的响应请求报文的冗余信息太多了,不只有IP地址.所以这次的实验主要就是解析DNS报文.同时也需要正确的填充请求报文.如果代码有什么bug,欢迎指正 ...

  9. Django - staticfiles,STATIC_ROOT, STATIC_URL,STATICFILES_DIRS

    staticfiles:这是一个静态资源管理的app,django.contrib.staticfiles.老的版本中,静态资源管理一直是一个问题,部分app发布的时候需要带上静态资源,在部署的时候必 ...

  10. socket函数

    为了执行网络IO,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 int socket(int family,int type,int protocol); 其中,famil ...