关闭

实体(Entity)Bean

标签: beanimportexceptionstringhibernatewebapp
601人阅读 评论(0) 收藏 举报
分类:

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence>
 <persistence-unit name="webapp">
  <jta-data-source>java:/webappDS</jta-data-source>
  <properties>
   <property name="hibernate.hbm2ddl.auto" value="update" />
  </properties>
 </persistence-unit>
</persistence>

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调用:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</head>
<body>
<%
InitialContext ctx = new InitialContext();
TUserDAO userDao = (TUserDAO) ctx.lookup("TUserDAOBean/remote");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try{
 if(userDao.addUser("werewi","M",sdf.parse("19830714")))
  out.println("Success");
 else
  out.println("Failure");
 
 Iterator it = userDao.getUserList().iterator();
 while(it.hasNext()){
  TUser user = (TUser) it.next();
  out.println(user.getName() + " " + user.getSex() + " " + sdf.format(user.getBirthday()));
 }
 
}catch(Exception e){
 out.println(e.toString());
}
%>
</body>
</html>

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:70081次
    • 积分:902
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:19篇
    • 译文:0篇
    • 评论:18条