EJB3.0之(Entity)Bean

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;
如果只有一个持久化内容配置,不需要明确指定。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值