工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > Java > 正文
EJB 3.0开发指南之使用实体Bean
[文章信息]
作者:smallnest
时间:2005-03-08
出处:blog
责任编辑:方舟
[文章导读]
在上面一个例子中,实体Bean的属性对应到数据表中的列,都是采用默认的设置
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 软件盗版与反盗版之战
· 图解PS按比例自动批量裁剪照片
· Windows开机关机故障分析及排除
· Visual FoxPro9.0构建管理系统图解
· 体验面对面的网络视频通讯
· 对付网页恶意代码
· Word动画教程:表格操作全接触
· JBuilder 2005开发Applet游戏全接触
· WinRAR操作技巧与另类应用
[正文]
  在上面一个例子中,实体Bean的属性对应到数据表中的列,都是采用默认的设置。通过Column,你可以为属性指定数据表中的列名。
Column的声明如下:

@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
}

  EntityManager 是用来处理实体Bean的辅助类。它可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,通过查询语言来查询实体Bean。

  下面是EntityManager接口的声明:

package javax.ejb;

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

public interface EntityManager {

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

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

 public <T> 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> T find(Class<T> 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);
}

  @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

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<Score> 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 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<Score> getScores()
 {
  return scores;
 }

 public void setScores(Collection<Score> scores)
 {
  this.scores = scores;
 }
}

  Student.java实现了Student实体Bean,它提供学生的基本情况以及学生的得分情况,得分是另外一个实体Bean。Student实体Bean和Score实体Bean是一对多的关系,站在Score的角度看是多对一的关系。

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

  Score.java

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;
 }

}

  这个实体Bean存放学生的分数。

  Teacher.java

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<String,Integer> map);



public Student getStudent();



@Remove

public void leave();

}

  这个会话Bean接口提供增加分数和得到用户的方法。

  TeacherBean.java

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<String,Integer> map)
 {
  if (student == null)
  {
   student = new Student();
  }
  student.setName(studentName);
  Set<String> set = map.keySet();
  for (String sname:set)
  {
   student.addScores(sname,map.get(sname).intValue());
  }
 }

 @Remove

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



}

  这个是会话Bean的实现类。

  Client.java

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<String,Integer> map = new HashMap<String,Integer>();
  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<Score> c = student.getScores();

  for (Score score:c)
  {
   System.out.printf("%s:%s%n",score.getName(),score.getNumber()+"");
  }
 }
}

  这个客户端增加学生的分数,并且测试显示这个学生的相关信息。

  请运行{$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。

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 深入探索CORBA对象生命周期之慨述
  • Decorator模式中遭遇继承与聚合的冲突
  • Eclipse 走上榜首 照亮Java众生
  • Taglib原理和实现:再论El和JSTL标签
  • Java桌面应用程序设计新贵:SWT 简介
  • 盛大新浪遭口水突袭 分析称有背后集团操纵
  • 创维进军半导体产业 投资2.4亿启动新项目
  • 中芯国际7亿美元融资难题 美光被指从中作梗
  • 新闻调查:揭开3999元笔记本电脑低价之谜
  • “魔兽世界”即将出世 中国开始限量公开测试
  • 信产部:2004年手机产业发展呈现九大特点
  • 【315】易美手机售后服务无人接管
  • 预测:信息化建设提速 3年投资将达1万亿
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索