标签:
在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、打包并部署到JBoss服务器。
6、开发客户端进行测试--StudentDAOClient.java。
最终实现,通过实体Bean的建立与MySQL数据库的连接,往数据表中插入一条记录。
</pre></h1><p><pre name="code" class="html"><datasource jta="true" jndi-name="java:jboss/datasources/KsMysqlDS" pool-name="KsMysqlDS" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://192.168.24.46:3306/ITOO_EXAM?useUnicode=true&characterEncoding=UTF-8</connection-url> <driver>mysql</driver> <pool> <prefill>false</prefill> <use-strict-min>false</use-strict-min> <flush-strategy>FailingConnectionOnly</flush-strategy> </pool> <security> <user-name>root</user-name> <password>123456</password> </security> </datasource>
其中包含3个配置元素,分别如下:
persistence-unit元素:可以有一个或多个,每个persistence-unit元素定义了持久化内容名称、使用的数据源名称及Hibernate属性。其中的name属性用于设置持久化名称。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; } }
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getId() { return this.id; }这样就开发完实体Bean了,它除了在POJO上添加了一些注释外,与普通的POJO类没有任何区别。
<span style="font-weight: normal;">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>
@PersistenceContext(unitName="exam-entity") EntityManager em;
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; } }
1、加载persistence.xml文件。
2、创建数据库表student,此时查看MySQL数据库就会看到新建的表student。
3、发布JNDI服务StudentDAO/remote。
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()函数插入该对象。运行该程序后,会在控制台中输出如下信息:
持久化API(JPA)系列(三)实体Bean的开发技术-建议与数据库的连接
标签:
原文地址:http://blog.csdn.net/zhaolijing2012/article/details/44775589