工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > Java > 正文
EJB 3.0 开发指南之依赖值对象
[文章信息]
作者:smallnest
时间:2005-03-08
出处:blog
责任编辑:方舟
[文章导读]
实体bean的属性可以是java基本对象、Date等,事实上,实体Bean的属性也可以是其他的java对象
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 软件盗版与反盗版之战
· 图解PS按比例自动批量裁剪照片
· Windows开机关机故障分析及排除
· Visual FoxPro9.0构建管理系统图解
· 体验面对面的网络视频通讯
· 对付网页恶意代码
· Word动画教程:表格操作全接触
· JBuilder 2005开发Applet游戏全接触
· WinRAR操作技巧与另类应用
[正文]
  在上面的章节我们提到,实体bean的属性可以是java基本对象、Date等,事实上,实体Bean的属性也可以是其他的java对象。这些Java对象不能直接从持久化上下文中读取,它依赖于主实体bean。不象关联实体Bean,在EJB3.0中不支持依赖值对象的集合。

  依赖值对象不支持继承,这将在EJB3.1中在讨论。

  依赖类需要使用◎DependentObject来注释:

@Target({TYPE}) @Retention(RUNTIME)
public @interface DependentObject {
 AccessType access() default PROPERTY;
}

  这个注释可以指定容器访问这个类的方法,是通过属性还是直接通过字段来访问。

  在实体Bean的一个属性需要使用依赖值对象,那么这个属性的get方法需要使用@Dependent注释:

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Dependent {
 DependentAttribute[] value() default {};
}

  这个注释可以指定依赖的属性DependentAttribute:

@Target({}) @Retention(RUNTIME)

public @interface DependentAttribute {
 String name();
 Column[] column() default {};
}

  可以指定属性名称和映射的列名。这里,一个主实体Bean的属性可以映射到数据表中的多列。

  如果你还不太明白,看下面的例子。

  这个例子主要有以下几个文件,这个例子主要实现了管理学生的功能。Student是一个实体Bean,这个Bean的name属性是一个类,也就是Name类,这个Name类就是一个依赖值对象。StudentDAOBean是一个无状态的会话Bean,用来调用实体Bean。和前面的例子一样,我们还是使用Client测试。

  ·Student.java:实体Bean。

  ·Name.java:实体Bean所依赖的类。

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

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

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

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

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

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

  Student.java

package com.kuaff.ejb3.dependent;

import javax.ejb.Dependent;
import javax.ejb.DependentAttribute;
import javax.ejb.Column;
import javax.ejb.Entity;
import javax.ejb.GeneratorType;
import javax.ejb.Id;
import javax.ejb.Table;

@Entity @Table(name = "STUDENT") public class Student implements java.io.Serializable
{
 private int id;
 private Name name;
 private String grade;
 private String email;

 @Id(generate = GeneratorType.AUTO)

 public int getId()
 {
  return id;
 }

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

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

@Dependent(
{ @DependentAttribute(name = "first", column ={ @Column(name = "FIRST") }),
 @DependentAttribute(name = "last", column ={ @Column(name = "LAST") }) })
 public Name getName()
 {
  return name;
 }

 public void setGrade(String grade)
 {
  this.grade = grade;
 }

 @Column(name = "GRADE")

 public String getGrade()
 {
  return grade;
 }

 public void setEmail(String email)
 {
  this.email = email;
 }

 @Column(name = "EMAIL")

 public String getEmail()
 {
  return email;
 }
}

  Student.java实现了Student实体Bean,它提供学生的基本情况。学生的姓名是Name类,通过@Dependent(

{ @DependentAttribute(name = "first", column ={ @Column(name = "FIRST") }),

@DependentAttribute(name = "last", column ={ @Column(name = "LAST") }) })

来声明,并指定这个依赖类的两个属性first和last,并映射到数据表的FIRST和LAST列上。

  Name.java

package com.kuaff.ejb3.dependent;

import java.io.Serializable;
import javax.ejb.AccessType;
import javax.ejb.DependentObject;

@DependentObject(access = AccessType.PROPERTY)

public class Name implements java.io.Serializable
{
 private String first;
 private String last;

 public Name()
 {}

 public Name(String first, String last)
 {
  this.first = first;
  this.last = last;
 }

 public String getFirst()
 {
  return first;
 }

 public void setFirst(String first)
 {
  this.first = first;
 }

 public String getLast()
 {
  return last;
 }

 public void setLast(String last)
 {
  this.last = last;
 }
}

  这个值对象也很简单,和一般的javaBean差不多,但有两个地方需要注意:

  1. 这个类实现了java.io.Serializable接口

  2. 这个类使用@DependentObject做了注释

  StudentDAO.java

package com.kuaff.ejb3.dependent;

import javax.ejb.Remote;
import java.util.List;

@Remote

public interface StudentDAO
{
 int create(String first, String last, String grade, String email);
 Student find(int id);
 List findByFirstName(String name);
 List findByLastName(String name);
 List findByEmail(String email);

 void merge(Student s);
}

  这个会话Bean接口提供查找用户的方法。

  StudentDAOBean.java

package com.kuaff.ejb3.dependent;

import java.util.List;
import javax.ejb.EntityManager;
import javax.ejb.Inject;
import javax.ejb.Stateless;

@Stateless

public class StudentDAOBean implements StudentDAO
{
 @Inject
 private EntityManager manager;

 public int create(String first, String last, String grade, String email)
 {
  Student student = new Student();
  student.setName(new Name(first,last));
  student.setGrade(grade);
  student.setEmail(email);
  manager.create(student);
  return student.getId();
 }

 public Student find(int id)
 {
  return manager.find(Student.class, id);
 }

 public List findByFirstName(String name)
 {
  return manager.createQuery("from Student s where s.name.last = :name").setParameter("name", name).listResults();
 }
 public List findByLastName(String name)
 {
  return manager.createQuery("from Student s where s.name.first = :name").setParameter("name", name).listResults();
 }

 public List findByEmail(String email)
 {
   return manager.createQuery("from Student s where s.email = :email").setParameter("email", email).listResults();
 }

 public void merge(Student s)
 {
  manager.merge(s);
 }

}

  这个是会话Bean的实现类。可以看到根据值对象的属性查找主实体Bean。

  Client.java

package com.kuaff.ejb3.dependent;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.List;

public class Client
{
 public static void main(String[] args) throws NamingException
 {
  InitialContext ctx = new InitialContext();
  StudentDAO dao = (StudentDAO) ctx.lookup(StudentDAO.class.getName());
  int id = dao.create("晁","岳攀","8","smallnest@kuaff.com");
  dao.create("朱","立焕","6","zhuzhu@kuaff.com");
  List list = dao.findByEmail("zhuzhu@kuaff.com");
  for(Object o:list)
  {
   Student s = (Student)o;
   System.out.printf("%s %s的email:%s%n",s.getName().getFirst(),s.getName().getLast(),s.getEmail());
  }
 }
}

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

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