工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > Java > 正文
EJB3.0开发指南之多对多和一对一
[文章信息]
作者:smallnest
时间:2005-02-11
出处:blog
责任编辑:方舟
[文章导读]
在前面的例子中,我们演示了一对多和多对一的例子,在本章将演示多对多和一对一的关系
advertisement
热点推荐
· Excel动画图解:按笔画排序姓名
· Visual Basic串口通讯调试方法
· 菜鸟如何用摄像头过拍摄瘾
· 拼音加加使用技巧三则
· 抢先体验天网最新版主要特色
[正文]

1 2  下一页

  在前面的例子中,我们演示了一对多和多对一的例子,在本章将演示多对多和一对一的关系。

  学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。

  学生和档案就是一对一的关系(不知道国外的学生有没有档案?)。

  为了实现多对多的关系,数据库中需要关联表,用以在两个实体间建立关联。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;
 }
}



1 2  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • EJB 3.0开发指南之多表映射
  • EJB的困惑:组件与可重用性的矛盾
  • 使用Java操作文本文件的方法详解
  • 谈谈J2SE中的序列化之接受默认序列化
  • 实战Java多线程编程精要之限制优先级
  • 山西短信发展面临瓶颈 扩容后仍有塞车现象
  • 质检总局:笔记本电脑抽样合格率为92.3%
  • 微软收购Sybari欲推付费反毒软件
  • 雅虎欲分娱乐产业一杯羹 将组建传媒集团
  • 惠普执行长费欧里娜辞职将获2100万美元
  • 惠普总裁离职及油价上涨造成纽约股市震荡
  • 我国将全面实施信息产业“走出去”战略
  • 为人师表到管理者与女人 惠普CEO辞职前后
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索