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

        在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。


        实体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缓存了,再次訪问时,就会直接从缓存中取得该实体对象。



转载于:https://www.cnblogs.com/mfrbuaa/p/5271309.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebSphere Classloader内存泄漏预防

解决应用程序类加载器泄漏 应用领域 倾向于&#xff1a; 使用应用程序类加载器中的Runnable实现启动新线程。 即使JEE编程模型不支持此功能&#xff0c;客户也经常直接创建新线程或通过使用间接创建它们 计时器 客户必须确保在停止相应的应用程序&#xff08;或WAR模块&…

airflow sql_alchemy_conn mysql_airflow使用mysql数据库,LocalExecutor并发调度

mysql-airflow在mysql上执行create database airflow; —— 创建数据库GRANT all privileges on airflow.* TO airflow% IDENTIFIED BY 123456; —— 将数据库airflow的所有权限授权airflow用户&#xff0c;密码123456且该用户可在任何IP段登录操作FLUSH PRIVILEGES; —— 刷新…

【SAP业务模式】之ICS(四):组织单元的配置

SAP的ICS业务后台配置主要有以下几个配置点&#xff1a; 1、组织单元的配置&#xff08;公司代码、销售组织、工厂、采购组织等&#xff09;&#xff1b; 2、主数据的部分&#xff1b; 3、订单和开票的定价过程&#xff1b; 4、开票输出类型&#xff1b; 5、公司间发票的配置&a…

poj-2478 Farey Sequence(dp,欧拉函数)

题目链接&#xff1a; Farey Sequence Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14230 Accepted: 5624Description The Farey Sequence Fn for any integer n with n > 2 is the set of irreducible rational numbers a/b with 0 < a < b < n a…

Twitter4j和Esper:在Twitter上跟踪用户情绪

对于复杂事件处理和Twitter API的新手&#xff0c;我希望这是一个简短的教程&#xff0c;可以帮助他们Swift起步。 管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter&#xff0c;Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hadoop&am…

webase crud查看所有表_Laravel-Gii 可视化代码生成工具 CRUD +GUI

Laravel-Gii 可视化代码生成工具 CRUD GUI适用于快速B端后台开发&#xff0c;根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件[TOC]注意因为是解析MySQL的表结构&#xff0c;并且根据字段生成模板&#xff0c;所以目前生成的Model类时只支…

20145231第二周Java学习笔记

20145231 《Java程序设计》第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本&#xff0c;再看视频&#xff0c;然后实践敲代码&#xff0c;最后根据学习笔记总结完成博客。 第三章&#xff1a;基础语法 知识点比较多比较零碎&#xff0c;整理的都是实际操作中可…

JavaFX 2.0和Scala,像牛奶和饼干

JavaFX 2.0和Scala都是很好的技术&#xff0c;但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术&#xff0c;具有先进的图形&#xff0c;动画和媒体功能。 Scala是一种简单但功能强大的语言&#xff0c;具有用于编写特定于域的语言&#xff08;DSL&#xff…

ASP.NET WebAPi之断点续传下载(上)

前言 之前一直感觉断点续传比较神秘&#xff0c;于是想去一探究竟&#xff0c;不知从何入手&#xff0c;以为就写写逻辑就行&#xff0c;结果搜索一番&#xff0c;还得了解相关http协议知识&#xff0c;又花了许久功夫去看http协议中有关断点续传知识&#xff0c;有时候发觉东西…

贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

3.0 C++远征:is a

4-4is_a 0.派生类Soldier继承自基类Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字节流转化为文件流_C#文件转换为字节流及字节流转换为文件

本文讲解了C#实现文件转换为字节流的方法。文件转换为字节流的步骤如下1、通过文件流打开指定文件(FileStream fs)&#xff1b;2、定义字节流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件读取到字节流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、关闭…

Spring和JSF集成:导航

我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”&#xff0c;因此&#xff0c;如果您签出代码&#xff0c;请注意它是一个不断变化的目标。 期待一些粗糙的边缘&#xff0c;如果有时会…

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…

宏的用法与简介

预处理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因为他们由预处理器解释的&#xff0c;所以称作预处理指令。预处理器读取源代码&#xff0c;然后对其修改&#xff0c;并把修改过的…

django 日志写入mysql_如何将django orm模型 写入数据库

1、指定连接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置连接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的数据库名称USER: root, #你的数据库用户名PASSWORD: , #你的数…

ORM的问题第2部分–查询

在我以前关于对象关系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我讨论了在处理当今常见的ORM&#xff08;包括Hibernate&#xff09;时遇到的各种问题。 其中包括与从POJO生成架构有关的问题&#xff0c;实际性能和不断出现的维护问题。 本质上&#xff0c;结论…