站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题EJB 3.0开发指南之使用实体Bean

EJB 3.0开发指南之使用实体Bean

摘要: 在上面一个例子中,实体Bean的属性对应到数据表中的列,都是采用默认的设置
  在上面一个例子中,实体Bean的属性对应到数据表中的列,都是采用默认的设置。通过Column,你可以为属性指定数据表中的列名。
Column的声明如下:

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface Column {
 String name() default "";
 boolean primaryKey() default false;
 boolean unique() default false;
 boolean nullable() default true;
 boolean insertable() default true;
 boolean updatable() default true;
 String columnDefinition() default "";
 String secondaryTable() default "";
 int length() default 255;
 int precision() default 0;
 int scale() default 0;
 boolean specified() default true; // For internal use only
}</td></tr></table>
  EntityManager 是用来处理实体Bean的辅助类。它可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,通过查询语言来查询实体Bean。

  下面是EntityManager接口的声明:

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>package javax.ejb;

import java.sql.Connection;
/**
* 用来和持久化上下文交互的接口
*/

public interface EntityManager {

 /**
 * 使实体bean受持久化管理
 * @param entity
 */

 public void create(Object entity);
 
 /**
 * 将给定的实体Bean的状态和持久化上下文结合。类似数据库的更新操作。
 * @param entity
 * @return 被结合的实体实例
 */

 public T merge(T entity);

 /**
 * 删除实例
 * @param entity
 */

 public void remove(Object entity);
 /**
 * 根据主键查找.
 * @param entityName
 * @param primaryKey
 * @return 查询实例
 */

 public Object find(String entityName, Object primaryKey);
 /**
 * 根据主键查找
 * @param primaryKey
 * @return 查询实例
 */

 public T find(Class entityClass, Object primaryKey);
 /**
 * 持久化上下文与底层数据库的同步
 */

 public void flush();
 /**
 * 执行一个EJBQL查询
 * @param ejbqlString EJBQL查询语句
 * @return the new query instance
 */

 public Query createQuery(String ejbqlString);
 /**
 * 执行命名的查询
 * @param name 预定义的查询名称
 * @return 查询实例
 */

 public Query createNamedQuery(String name);
 /**
 * 执行一个本地SQL查询语句
 * @param sqlString 本地查询语句
 * @return 返回查询实例
 */

 public Query createNativeQuery(String sqlString);
 /**
 * 更新到数据库中
 * @param entity
 */

 public void refresh(Object entity);
 /**
 * 持久化上下文中删除实体
 * @param entity
 */

 public void evict(Object entity);
 /**
 * 检查当前上下文中是否包含此实体
 * context.
 * @param entity
 * @return
 */

 public boolean contains(Object entity);
}
</td></tr></table>
  @JoinColumns

  用来指示符合主键,在后面的章节中介绍。

   这个例子主要有以下几个文件,这个例子主要实现了管理学生分数的功能。Student是一个实体Bean,管 理学生的基本信息(姓名和各课分数),其中学生的分数又是一个实体Bean。TacherBean是一个无状态的会话Bean,用来调用实体Bean。和前面的例子一样,我们还是使用Client测试。

  ·Student.java:实体Bean。

  ·Score.java:实体Bean。

  ·Teacher.java:会话Bean的业务接口

  ·TeacherBean.java:会话Bean的实现类

  ·Client.java:测试EJB的客户端类。

  ·jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。

  ·Build.xml:ant 配置文件,用以编译、发布、测试、清除EJB。

  下面针对每个文件的内容做一个介绍。

  Student.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>package com.kuaff.ejb3.entity;

import javax.ejb.CascadeType;
import javax.ejb.Entity;
import javax.ejb.FetchType;
import javax.ejb.GeneratorType;
import javax.ejb.Id;
import javax.ejb.JoinColumn;
import javax.ejb.OneToMany;
import javax.ejb.Table;
import java.util.ArrayList;
import java.util.Collection;
import java.io.Serializable;

@Entity
@Table(name = "STUDENT")

public class Student implements Serializable
{
 //主键
 private int id;
 //学生名
 private String name;
 //学生的分数
 private Collection scores;
 //主键自动产生

 @Id(generate = GeneratorType.AUTO)

 public int getId()
 {
  return id;
 }

 public void setId(int id)
 {
  this.id = id;
 }

 public String getName()
 {
  return name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 public void addScores(String name,int number)
 {
  if (scores == null)
  {
   scores = new ArrayList();
  }
  Score score = new Score();
  score.setName(name);
  score.setNumber(number);
  score.setStudent(this);
  scores.add(score);
 }

 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
 @JoinColumn(name = "student_id")

 public Collection getScores()
 {
  return scores;
 }

 public void setScores(Collection scores)
 {
  this.scores = scores;
 }
}</td></tr></table>
  Student.java实现了Student实体Bean,它提供学生的基本情况以及学生的得分情况,得分是另外一个实体Bean。Student实体Bean和Score实体Bean是一对多的关系,站在Score的角度看是多对一的关系。

  实体Bean需要使用@Entity做注释,另外它指定这个实体Bean与表STUDENT对应(通过注释@Table(name = "STUDENT")),你可以在JBOSS的数据库中看到这个表。

  Score.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>package com.kuaff.ejb3.entity;

import java.io.Serializable;
import javax.ejb.Entity;
import javax.ejb.GeneratorType;
import javax.ejb.Id;
import javax.ejb.JoinColumn;
import javax.ejb.ManyToOne;
import javax.ejb.Table;

@Entity
@Table(name = "Score")

public class Score implements Serializable
{
 private int id;
 private String name;
 private int number;
 private Student student;

 //主键自动产生

 @Id(generate = GeneratorType.AUTO)

 public int getId()
 {
  return id;
 }

 public void setId(int id)
 {
  this.id = id;
 }

 public String getName()
 {
  return name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 public int getNumber()
 {
  return number;
 }

 public void setNumber(int number)
 {
  this.number = number;
 }

 @ManyToOne
 @JoinColumn(name = "student_id")

 public Student getStudent()
 {
  return student;
 }

 public void setStudent(Student student)
 {
  this.student = student;
 }

} </td></tr></table>
  这个实体Bean存放学生的分数。

  Teacher.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>package com.kuaff.ejb3.entity;



import javax.ejb.Remote;

import javax.ejb.Remove;

import java.util.Map;



@Remote

public interface Teacher

{

public void addScore(String studentName,Map map);



public Student getStudent();



@Remove

public void leave();

}</td></tr></table>
  这个会话Bean接口提供增加分数和得到用户的方法。

  TeacherBean.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>package com.kuaff.ejb3.entity;

import javax.ejb.EntityManager;
import javax.ejb.Inject;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import java.util.Map;
import java.util.Set;

@Stateful

public class TeacherBean implements Teacher
{
 @Inject
 private EntityManager manager;
 private Student student;

 public Student getStudent()
 {
  return student;
 }

 public void addScore(String studentName, Map map)
 {
  if (student == null)
  {
   student = new Student();
  }
  student.setName(studentName);
  Set set = map.keySet();
  for (String sname:set)
  {
   student.addScores(sname,map.get(sname).intValue());
  }
 }

 @Remove

 public void leave()
 {
  manager.create(student);
 }



}
</td></tr></table>
  这个是会话Bean的实现类。

  Client.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>package com.kuaff.ejb3.entity;

import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Client
{
 public static void main(String[] args) throws NamingException
 {
  InitialContext ctx = new InitialContext();
  Teacher teacher = (Teacher) ctx.lookup(Teacher.class.getName());
  Map map = new HashMap();
  map.put("语文",new Integer(98));
  map.put("化学",new Integer(149));
  map.put("物理",new Integer(143));
  teacher.addScore("smallnest",map);
  Student student = teacher.getStudent();
  String name = student.getName();
  System.out.printf("显示%s的分数:%n",name);
  Collection c = student.getScores();

  for (Score score:c)
  {
   System.out.printf("%s:%s%n",score.getName(),score.getNumber()+"");
  }
 }
}
</td></tr></table>
  这个客户端增加学生的分数,并且测试显示这个学生的相关信息。

  请运行{$JBOSS_HOME}/bin目录下的run.bat: run –c all,启动JBOSS。

http://localhost:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss%3Aservice%3DHypersonic%2Cdatabase%3DlocalDB,然后调用startDatabaseManager()方法,打开HSQL管理工具管理数据库。

  在Eclipse的Ant视图中执行ejbjar target。或者在命令行下,进入到此工程目录下,执行ant ejbjar,将编译打包发布此EJB。

  在Eclipse的Ant视图中执行run target。或者在命令行下,进入到此工程目录下,执行ant run,测试这个EJB。



↑返回目录
前一篇: 深入浅出基于Java的代理设计模式
后一篇: EJB 3.0 开发指南之依赖值对象