persistence.xml
persistence-unit 节点可以有一个或多个,每个persistence-unit 节点定义了持久化内容名称、使用的数据源名称及Hibernate属性。name 属性用作设置持久化名称。jta-data-source 节点用作指定实体Bean使用的数据源名称,指定数据源名称时java:/ 前缀不能缺少,数据源名称大小写敏感。properties 节点用作指定Hibernate的各项属性,如果hibernate.hbm2ddl.auto的值设为create-drop,在实体Bean发布及卸载时将自动创建及删除相应数据库表(注意:Jboss服务器启动或关闭时会引发实体Bean的发布及卸载)。
如果你的表已经存在,并且想保留数据,发布实体bean时可以把hibernate.hbm2ddl.auto的值设为none或update,以后为了实体bean 的改动能反应到数据表,建议使用update,这样实体Bean添加一个属性时能同时在数据表增加相应字段
persistence.xml要放到META-INF文件下,并打包进JAR文件里才行。
实体Bean
package ejb;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name="T_USER")//表名为T_USER,后面getUserList()方法里,用的是:from TUser u order by name,和EntityBean的类名相同。
@SuppressWarnings("serial")
public class TUser implements Serializable {
private String name;
private String sex;
private Date birthday;
@Id
@Column(name="name",length=20,nullable=false)
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@Column(name="sex",length=1,nullable=false)
public String getSex(){
return sex;
}
public void setSex(String sex) throws Exception{
if(sex.matches("[FMSfms]")){
this.sex = sex;
}else{
throw new Exception("Sex Error!Must be in S,F,M");
}
}
@Column(name="birthday")
public Date getBirthday(){
return birthday;
}
public void setBirthday(Date birthday){
this.birthday = birthday;
}
}
@Entity注释指明这是一个实体Bean,每个实体Bean类映射数据库中的一个表,@Table注释的name属性指定映射的数据表名称.
实体Bean的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。
@Column注释定义了映射到列的所有属性,如列名是否唯一,是否允许为空,是否允许更新等,他的属性介绍如下:
·name: 映射的列名。如:映射Person表的PersonName列,可以在name属性的getName 方法上面加入
@Column(name = "PersonName"),如果不指定映射列名,容器将属性名称作为默认的映射列名。
·unique: 是否唯一
·nullable: 是否允许为空
·length: 对于字符型列,length属性指定列的最大字符长度
·insertable: 是否允许插入
·updatable: 是否允许更新
·columnDefinition: 定义建表时创建此列的DDL
·secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
@Id 注释指定personid属性为表的主键,它可以有多种生成方式:
·TABLE:容器指定用底层的数据表确保唯一。
·SEQUENCE:使用数据库的SEQUENCE 列来保证唯一
·IDENTITY:使用数据库的INDENTIT列来保证唯一
·AUTO:由容器挑选一个合适的方式来保证唯一
·NONE:容器不负责主键的生成,由调用程序来完成。
@GeneratedValue注释定义了标识字段的生成方式
实体bean需要在网络上传送时必须实现Serializable接口,否则将引发java.io.InvalidClassException例外。
用户实体Bean的Session Bean
package ejb;
import java.util.Date;
import java.util.List;
import ejb.TUser;
public interface TUserDAO {
public boolean addUser(String name,String sex,Date birthday);
public boolean updateUser(TUser user);
public boolean deleteUser();
public List getUserList();
}
package ejb;
import javax.ejb.Stateless;
import javax.ejb.Remote;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
import ejb.TUserDAO;
import ejb.TUser;
@Remote(TUserDAO.class)
@Stateless
public class TUserDAOBean implements TUserDAO {
@PersistenceContext(unitName="webapp")
protected EntityManager em;
public boolean addUser(String name,String sex,Date birthday){
try{
TUser user = new TUser();
user.setName(name);
user.setSex(sex);
user.setBirthday(birthday);
em.persist(user);
}catch(Exception e){
//e.printStackTrace();
return false;
}
return true;
}
public boolean updateUser(TUser user){
try{
em.merge(user);
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
public boolean deleteUser(){
return false;
}
public List getUserList(){
try{
Query query = em.createQuery("from TUser u order by name");
List list = query.getResultList();
em.clear();
return list;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
EntityManager em,EntityManager 是由EJB容器自动地管理和配置的,不需要用户自己创建,他用作操作实体Bean
em.find()方法用作查询主键记录。em.persist()方法用作向数据库插入一条记录。在类中并没有看到对EntityManager em进行赋值,后面却可以直接使用他。这是因为在实体Bean加载时,容器通过@PersistenceContext注释动态注入EntityManager 对象。
如果persistence.xml文件中配置了多个不同的持久化内容。你需要指定持久化名称注入EntityManager 对象,可以
通过@PersistenceContext注释的unitName属性进行指定,例:
@PersistenceContext(unitName="webapp")
EntityManager em;
如果只有一个持久化内容配置,不需要明确指定。
JSP调用:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import = "ejb.*" %>
<%@ page import = "java.text.SimpleDateFormat" %>
<%@ page import = "javax.naming.*" %>
<%@ page import = "java.util.Iterator" %>