EJB3.0开发指南:依赖值对象

前端之家收集整理的这篇文章主要介绍了EJB3.0开发指南:依赖值对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在上面的章节我们提到,实体bean属性可以是java基本对象、Date等,事实上,实体Bean属性也可以是其他的java对象。这些Java对象不能直接从持久化上下文中读取,它依赖于主实体bean。不象关联实体Bean,在EJB3.0不支持依赖值对象的集合。@H_301_39@

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

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

@Target({TYPE}) @Retention(RUNTIME)@H_301_39@

public @interface DependentObject {@H_301_39@

AccessType access() default PROPERTY;@H_301_39@

}@H_301_39@

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

@H_301_39@

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

@H_301_39@

@Target({METHOD,FIELD}) @Retention(RUNTIME)@H_301_39@

public @interface Dependent {@H_301_39@

DependentAttribute[] value() default {};@H_301_39@

}@H_301_39@

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

@Target({}) @Retention(RUNTIME)@H_301_39@

public @interface DependentAttribute {@H_301_39@

String name();@H_301_39@

Column[] column() default {};@H_301_39@

}@H_301_39@

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

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

@H_301_39@

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

@H_301_39@

Student.java:实体Bean@H_301_39@

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

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

StudentDAOBean.java:会话Bean的实现类@H_301_39@

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

jndi.propertiesjndi属性文件,提供访问jdni的基本配置属性@H_301_39@

Build.xmlant 配置文件,用以编译、发布、测试、清除EJB@H_301_39@

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

@H_301_39@

Student.java@H_301_39@

@H_301_39@

package com.kuaff.ejb3.dependent;@H_301_39@

@H_301_39@

import javax.ejb.Dependent;@H_301_39@

import javax.ejb.DependentAttribute;@H_301_39@

import javax.ejb.Column;@H_301_39@

import javax.ejb.Entity;@H_301_39@

import javax.ejb.GeneratorType;@H_301_39@

import javax.ejb.Id;@H_301_39@

import javax.ejb.Table;@H_301_39@

@H_301_39@

@Entity @Table(name = "STUDENT") public class Student implements java.io.Serializable@H_301_39@

{@H_301_39@

private int id;@H_301_39@

@H_301_39@

private Name name;@H_301_39@

@H_301_39@

private String grade;@H_301_39@

@H_301_39@

private String email;@H_301_39@

@H_301_39@

@Id(generate = GeneratorType.AUTO) @H_301_39@

public int getId()@H_301_39@

{@H_301_39@

return id;@H_301_39@

}@H_301_39@

@H_301_39@

public void setId(int id)@H_301_39@

{@H_301_39@

this.id = id;@H_301_39@

}@H_301_39@

@H_301_39@

public void setName(Name name)@H_301_39@

{@H_301_39@

this.name = name;@H_301_39@

}@H_301_39@

@H_301_39@

@Dependent(@H_301_39@

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

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

public Name getName()@H_301_39@

{@H_301_39@

return name;@H_301_39@

}@H_301_39@

@H_301_39@

public void setGrade(String grade)@H_301_39@

{@H_301_39@

this.grade = grade;@H_301_39@

}@H_301_39@

@H_301_39@

@Column(name = "GRADE") @H_301_39@

public String getGrade()@H_301_39@

{@H_301_39@

return grade;@H_301_39@

}@H_301_39@

@H_301_39@

public void setEmail(String email)@H_301_39@

{@H_301_39@

this.email = email;@H_301_39@

}@H_301_39@

@H_301_39@

@Column(name = "EMAIL") @H_301_39@

public String getEmail()@H_301_39@

{@H_301_39@

return email;@H_301_39@

}@H_301_39@

@H_301_39@

}@H_301_39@

@H_301_39@

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

{ @DependentAttribute(name = "first",@H_301_39@

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

来声明,并指定这个依赖类的两个属性firstlast,并映射到数据表的FIRSTLAST列上。@H_301_39@

Name.java@H_301_39@

@H_301_39@

package com.kuaff.ejb3.dependent;@H_301_39@

@H_301_39@

import java.io.Serializable;@H_301_39@

import javax.ejb.AccessType;@H_301_39@

import javax.ejb.DependentObject;@H_301_39@

@H_301_39@

@DependentObject(access = AccessType.PROPERTY)@H_301_39@

public class Name implements java.io.Serializable@H_301_39@

{@H_301_39@

private String first;@H_301_39@

private String last;@H_301_39@

@H_301_39@

public Name()@H_301_39@

{@H_301_39@

}@H_301_39@

@H_301_39@

public Name(String first,String last)@H_301_39@

{@H_301_39@

this.first = first;@H_301_39@

this.last = last;@H_301_39@

}@H_301_39@

@H_301_39@

public String getFirst()@H_301_39@

{@H_301_39@

return first;@H_301_39@

}@H_301_39@

@H_301_39@

public void setFirst(String first)@H_301_39@

{@H_301_39@

this.first = first;@H_301_39@

}@H_301_39@

@H_301_39@

public String getLast()@H_301_39@

{@H_301_39@

return last;@H_301_39@

}@H_301_39@

@H_301_39@

public void setLast(String last)@H_301_39@

{@H_301_39@

this.last = last;@H_301_39@

}@H_301_39@

}@H_301_39@

@H_301_39@

@H_301_39@


































































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

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

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

@H_301_39@

StudentDAO.java@H_301_39@

@H_301_39@

package com.kuaff.ejb3.dependent;@H_301_39@

@H_301_39@

import javax.ejb.Remote;@H_301_39@

import java.util.List;@H_301_39@

@H_301_39@

@Remote@H_301_39@

public interface StudentDAO@H_301_39@

{@H_301_39@

int create(String first,String last,String grade,String email);@H_301_39@

@H_301_39@

Student find(int id);@H_301_39@

List findByFirstName(String name);@H_301_39@

List findByLastName(String name);@H_301_39@

List findByEmail(String email);@H_301_39@

@H_301_39@

void merge(Student s);@H_301_39@

}@H_301_39@

@H_301_39@



































这个会话Bean接口提供查找用户方法
@H_301_39@

@H_301_39@

StudentDAOBean.java@H_301_39@

@H_301_39@

@H_301_39@

package com.kuaff.ejb3.dependent;@H_301_39@

@H_301_39@

import java.util.List;@H_301_39@

import javax.ejb.EntityManager;@H_301_39@

import javax.ejb.Inject;@H_301_39@

import javax.ejb.Stateless;@H_301_39@

@H_301_39@

@Stateless@H_301_39@

public class StudentDAOBean implements StudentDAO@H_301_39@

{@H_301_39@

@H_301_39@

@Inject@H_301_39@

private EntityManager manager;@H_301_39@

@H_301_39@

public int create(String first,String email)@H_301_39@

{@H_301_39@

Student student = new Student();@H_301_39@

student.setName(new Name(first,last));@H_301_39@

student.setGrade(grade);@H_301_39@

student.setEmail(email);@H_301_39@

manager.create(student);@H_301_39@

return student.getId();@H_301_39@

}@H_301_39@

@H_301_39@

public Student find(int id)@H_301_39@

{@H_301_39@

return manager.find(Student.class,id);@H_301_39@

}@H_301_39@

@H_301_39@

@H_301_39@

public List findByFirstName(String name)@H_301_39@

{@H_301_39@

return manager.createQuery("from Student s where s.name.last = :name").setParameter("name",name).listResults();@H_301_39@

}@H_301_39@

@H_301_39@

@H_301_39@

public List findByLastName(String name)@H_301_39@

{@H_301_39@

return manager.createQuery("from Student s where s.name.first = :name").setParameter("name",name).listResults();@H_301_39@

}@H_301_39@

@H_301_39@

@H_301_39@

public List findByEmail(String email)@H_301_39@

{@H_301_39@

@H_301_39@

return manager.createQuery("from Student s where s.email = :email").setParameter("email",email).listResults();@H_301_39@

}@H_301_39@

@H_301_39@

@H_301_39@

public void merge(Student s)@H_301_39@

{@H_301_39@

manager.merge(s);@H_301_39@

}@H_301_39@

@H_301_39@

}@H_301_39@

@H_301_39@



























































































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

@H_301_39@

Client.java@H_301_39@

@H_301_39@

@H_301_39@

package com.kuaff.ejb3.dependent;@H_301_39@

@H_301_39@

import javax.naming.InitialContext;@H_301_39@

import javax.naming.NamingException;@H_301_39@

@H_301_39@

import java.util.List;@H_301_39@

@H_301_39@

public class Client@H_301_39@

{@H_301_39@

@H_301_39@

public static void main(String[] args) throws NamingException@H_301_39@

{@H_301_39@

InitialContext ctx = new InitialContext();@H_301_39@

StudentDAO dao = (StudentDAO) ctx.lookup(StudentDAO.class.getName());@H_301_39@

int id = dao.create("","岳攀","8","smallnest@kuaff.com");@H_301_39@

dao.create("","立焕","6","zhuzhu@kuaff.com");@H_301_39@

@H_301_39@

List list = dao.findByEmail("zhuzhu@kuaff.com");@H_301_39@

for(Object o:list)@H_301_39@

{@H_301_39@

Student s = (Student)o;@H_301_39@

System.out.printf("%s %semail:%s%n",s.getName().getFirst(),s.getName().getLast(),s.getEmail());@H_301_39@

}@H_301_39@

}@H_301_39@

}@H_301_39@

@H_301_39@












































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

@H_301_39@

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

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

@H_301_39@

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

@H_301_39@

@H_301_39@

EclipseAnt视图中执行run target。或者在命令行下,进入到此工程目录下,执行ant run,测试这个EJB@H_301_39@ 原文链接:https://www.f2er.com/javaschema/288402.html

猜你在找的设计模式相关文章