服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

ejb 3.0开发指南之依赖值对象


  在上面的章节我们提到,实体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 ?cc all

扫描关注微信公众号