当前位置: 首页 > 图文教程 > 网络编程 > JSP > EJB 3.0开发指南之多表映射

JSP
Java 创建cookie和删除cookie
jsp 从web.xml读取连接数据库的参数
jsp 不支持EL表达式,解决办法
jsp 获取客户端的浏览器和操作系统信息
struts2 session 解读
struts2 spring整合fieldError问题
jsp 生成验证码代码
搭建java WEB开发环境和应用
JSP 自定义标签
Java 区分文本中的中英文字符函数
通用JSP页面 jsp入门级文章
jsp struts1 标签实例详解
一个jdbc 测试程序代码
SSH整合中 hibernate托管给Spring得到SessionFactory
jsp SmartUpload 实现上传功能代码
jsp Unsupported encoding: gb2312 错误原因
java Struts2 在拦截器里的跳转问题
jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
Java 项目生成静态页面的代码
jdk与jre的区别 很形象,很清晰,通俗易懂

JSP 中的 EJB 3.0开发指南之多表映射


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 62 ::
收藏到网摘: n/a

在前面的例子中,我们每一个实体Bean只映射到数据库中的一张表上。事实上,一个实体Bean可以映射到多张表上。在一些需要字典表的项目上会经常用到,象以前我做过的项目,使用到很多国标规定的数据表。在我们下面这个例子中,性别作为一个字典表存在,学生这个实体将映射到学生信息表、性别表这两个表。
  从表可以使用@SecondaryTable来注释:
  @Target({TYPE}) @Retention(RUNTIME)
  public @interface SecondaryTable {
  String name();
  String catalog() default "";
  String schema() default "";
  JoinColumn[] join() default {};
  UniqueConstraint[] uniqueConstraints() default {};
  }
  这个注释可以指定表名、分类、schema、联合列、约束等。假如你使用多张表,你可以使用下面的注释来声明多张表:
  @SecondaryTable
  @Target({TYPE}) @Retention(RUNTIME)
  public @interface SecondaryTables {
  SecondaryTable[] value() default {};
  }
  这个例子主要有以下几个文件,这个例子主要实现了管理学生的功能。Student是一个实体Bean,这个Bean的name属性是一个类,也就是Name类,这个Name类就是一个依赖值对象。学生的性别映射到第二张表中。StudentDAOBean是一个无状态的会话Bean,用来调用实体Bean。和前面的例子一样,我们还是使用Client测试。
  这个例子和上一个例子基本相同,只是Student.java和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.secondary;
  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;
  import javax.ejb.SecondaryTables;
  import javax.ejb.SecondaryTable;
  import javax.ejb.JoinColumn;
  @Entity
  @Table(name = "STUDENT")
  @SecondaryTables({
  @SecondaryTable(name = "GENDER", join = {@JoinColumn(name = "GENDER_ID")})
  })
  public class Student implements java.io.Serializable
  {
  private int id;
  private Name name;
  private String grade;
  private String email;
  private String gender;
  @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;
  }
  public void setGender(String gender)
  {
  this.gender = gender;
  }
  @Column(name = "gender", secondaryTable = "GENDER")
  public String getGender()
  {
  return gender;
  }
  }

  Student.java实现了Student实体Bean,它提供学生的基本情况。在类上声明上加上了第二张表的注释:
  @SecondaryTables({
  @SecondaryTable(name = "GENDER", join = {@JoinColumn(name = "GENDER_ID")})
  })
  在gender属性上加上了映射第二张的注释:
  @Column(name = "gender", secondaryTable = "GENDER")
  Client.java
  package com.kuaff.ejb3.secondary;
  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","[email protected]","男");
  dao.create("朱","立焕","6","[email protected]","女");

  List list = dao.findAll();
  for(Object o:list)
  {
  Student s = (Student)o;
  System.out.printf("%s%s的性别:%s%n",s.getName().getFirst(),s.getName().getLast(),s.getGender());
  dao.evict(s);
  }
  这个客户端增加学生的分数,并且测试显示这个学生的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。