在上面的章节我们提到,实体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
闽公网安备 35060202000074号