服务热线:13616026886

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

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

ejb3.0开发指南之多对多和一对一


  学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。
  
  学生和档案就是一对一的关系(不知道国外的学生有没有档案?)。
  
  为了实现多对多的关系,数据库中需要关联表,用以在两个实体间建立关联。jboss可以自动生成关联表,你也可以@associationtable来指定关联表的信息。
  
  如:
  
  @manytomany(cascade = {cascadetype.create, cascadetype.merge}, fetch = fetchtype.eager, isinverse = true)
  @associationtable(table = @table(name = "student_teacher"),
  
  joincolumns = {@joincolumn(name = "teacher_id")},inversejoincolumns = {@joincolumn(name = "student_id")})
  
  @ associationtable的注释声明如下:
  @target({method, field})
  
  public @interface associationtable {
  table table() default @table(specified=false);
  joincolumn[] joincolumns() default {};
  joincolumn[] inversejoincolumns() default {};
  }
  
  关联表注释指定了关联表的名称、主表的列和从表的列。
  
  为了实现一对一的关系,需要用@onetoone来注释。
  
  如:
  
  @onetoone(cascade = {cascadetype.all})
  @joincolumn(name = "dossier_id")
  
  public dossier getdossier()
  {
  return dossier;
  }
  
  这定义了一个单向的一对一的关系。如果在dossier也定义了相关的关联,那么它就是双向的。双向的意思就是通过一个student实体就可以查找到一个dossier,通过一个dossier就可以查找到一个student。
  
  @ onetoone的注释声明如下:
  @target({method, field}) @retention(runtime)
  
  public @interface onetoone {
  string targetentity() default "";
  cascadetype[] cascade() default {};
  fetchtype fetch() default eager;
  boolean optional() default true;
  }
  
  这个例子主要有以下几个文件,这个例子主要实现了学生和老师、学生和档案之间的关系。student、teacher、dossier都是实体bean。student和dossier是一个双向的onetoone之间的关系,student和teacher是manytomany的关系,也是双向的。和前面的例子一样,我们还是使用client测试。
  
  student.java:实体bean。
  
  dossier.java:实体bean所依赖的类。
  
  teacher.java:实体bean所依赖的类。
  
  entitytest.java:会话bean的业务接口
  
  entitytest bean.java:会话bean的实现类
  
  client.java:测试ejb的客户端类。
  
  jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。
  
  build.xml:ant 配置文件,用以编译、发布、测试、清除ejb。
  
  下面针对每个文件的内容做一个介绍。
  
  student.java
  
  package com.kuaff.ejb3.relationships;
  import javax.ejb.cascadetype;
  import javax.ejb.entity;
  import javax.ejb.fetchtype;
  import javax.ejb.generatortype;
  import javax.ejb.id;
  import javax.ejb.joincolumn;
  import javax.ejb.onetoone;
  import javax.ejb.manytomany;
  import javax.ejb.table;
  import javax.ejb.associationtable;
  import java.util.arraylist;
  import java.util.set;
  import java.util.collection;
  import java.io.serializable;
  
  @entity
  
  @table(name = "student")
  
  public class student implements serializable
  
  {
  private int id;
  private string first;
  private string last;
  private dossier dossier;
  private set<teacher> teachers;
  
  @id(generate = generatortype.auto)
  
  public int getid()
  {
  return id;
  }
  
  public void setid(int id)
  {
  this.id = id;
  }
  
  public void setfirst(string first)
  {
  this.first = first;
  }
  
  public string getfirst()
  {
  return first;
  }
  
  public void setlast(string last)
  {
  this.last = last;
  }
  
  public string getlast()
  {
  return last;
  }
  
  public void setdossier(dossier dossier)
  {
  this.dossier = dossier;
  }
  
  @onetoone(cascade = {cascadetype.all})
  @joincolumn(name = "dossier_id")
  
  public dossier getdossier()
  {
  return dossier;
  }
  
  public void setteacher(set<teacher> teachers)
  {
  this.teachers = teachers;
  }
  
  @manytomany(cascade = {cascadetype.create, cascadetype.merge}, fetch = fetchtype.eager, isinverse = true)
  @associationtable(table = @table(name = "student_teacher"),
  
  joincolumns = {@joincolumn(name = "teacher_id")},inversejoincolumns = {@joincolumn(name = "student_id")})
  
  public set<teacher> getteacher()
  {
  return teachers;
  }
  }
  
  
  dossier.java
  
  package com.kuaff.ejb3.relationships;
  
  import javax.ejb.entity;
  import javax.ejb.generatortype;
  import javax.ejb.id;
  
  @entity
  
  public class dossier implements java.io.serializable
  {
  private long id;
  private string resume;
  
  @id(generate = generatortype.auto)
  public long getid()
  {
  return id;
  }
  
  public void setid(long id)
  {
  this.id = id;
  }
  
  public void setresume(string resume)
  {
  this.resume = resume;
  }
  
  public string getresume()
  {
  return resume;
  }
  }
  
  teacher.java
  
  package com.kuaff.ejb3.relationships;
  
  import javax.ejb.associationtable;
  import javax.ejb.basic;
  import javax.ejb.cascadetype;
  import javax.ejb.column;
  import javax.ejb.entity;
  import javax.ejb.fetchtype;
  import javax.ejb.id;
  import javax.ejb.joincolumn;
  import javax.ejb.manytomany;
  import javax.ejb.table;
  import javax.ejb.transient;
  import javax.ejb.version;
  import java.util.set;
  import javax.ejb.generatortype;
  
  @entity
  
  public class teacher implements java.io.serializable
  {
  private long id;
  private string resume;
  private string name;
  private string info;
  private set<student> students;
  
  @id(generate = generatortype.identity)
  
  public long getid()
  {
  return id;
  }
  
  public void setid(long id)
  {
  this.id = id;
  }
  
  public void setname(string name)
  {
  this.name = name;
  }
  
  public string getname()
  {
  return name;
  }
  
  public void setinfo(string info)
  {
  this.info = info;
  }
  
  public string getinfo()
  {
  return info;
  }
  
  public void setstudents(set<student> students)
  {
  this.students = students;
  }
  
  @manytomany(cascade = {cascadetype.create, cascadetype.merge}, fetch = fetchtype.eager)
  @associationtable(table = @table(name = "student_teacher"),
  
  joincolumns = {@joincolumn(name = "teacher_id",referencedcolumnname="id")},
  inversejoincolumns = {@joincolumn(name = "student_id",referencedcolumnname="id")})
  
  public set<student> getstudents()
  {
  return students;
  }
  }
  
  entitytest.java
  
  package com.kuaff.ejb3.relationships;
  
  import javax.ejb.remote;
  import java.util.list;
  
  @remote
  
  public interface entitytest
  {
  public void createdata();
  public list findbyname(string name);
  }
  
  entitytestbean.java
  
  package com.kuaff.ejb3.relationships;
  
  import javax.ejb.entitymanager;
  import javax.ejb.inject;
  import javax.ejb.stateless;
  import java.util.hashset;
  import java.util.set;
  import java.util.

扫描关注微信公众号