`
javaOpen
  • 浏览: 123624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • J2SE
阅读更多
学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。

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

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

@Stateless

public class EntityTestBean implements EntityTest
{
 private @Inject EntityManager manager;
 public void createData()
 {
  Teacher teacher1 = new Teacher();
  Teacher teacher2 = new Teacher();

  Set<Student> students1 = new HashSet<Student>();
  Set<Student> students2 = new HashSet<Student>();
  Student student1 = new Student();
  Student student2 = new Student();
  Student student3 = new Student();

  Dossier dossier1 = new Dossier();
  Dossier dossier2 = new Dossier();
  Dossier dossier3 = new Dossier();
  teacher1.setId(new Long(1));
  teacher1.setName("hushisheng");
  teacher1.setInfo("胡时胜教授,博士生导师");
  manager.create(teacher1);
  teacher2.setId(new Long(2));
  teacher2.setName("liyongchi");
  teacher2.setInfo("李永池教授,博士生导师");
  manager.create(teacher2);

  student1.setFirst("晁");
  student1.setLast("岳攀");
  dossier1.setResume("这是晁岳攀的档案");
  student1.setDossier(dossier1);
  students1.add(student1);

  student2.setFirst("赵");
  student2.setLast("志伟");
  dossier2.setResume("这是赵志伟的档案");
  student2.setDossier(dossier2);
  students1.add(student2);

  student3.setFirst("田");
  student3.setLast("明");

  dossier3.setResume("这是田明的档案");
  student3.setDossier(dossier3);
  students2.add(student3);

  teacher1.setStudents(students1);
  teacher2.setStudents(students2);

 }

 public List findByName(String name)
 {
  return manager.createQuery("from Teacher t where t.name = :name").setParameter("name", name).listResults();
 }

}

  在这个会话Bean中提供了创建各个实体Bean的方法,并提供了查找老师的方法。

  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","smallnest@kuaff.com","男");
  dao.create("朱","立焕","6","zhuzhu@kuaff.com","女");
  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);
  }
 }



分享到:
评论

相关推荐

    ejb3.0开发实例(java工程)

    在这个"ejb3.0开发实例(java工程)"中,我们将深入探讨EJB 3.0的主要特性和开发实践。 1. **注解驱动**:EJB 3.0最大的变革之一就是大量使用注解(Annotation),减少了XML配置文件的使用。例如,@Stateless、@...

    ejb3.0开发规范PDF

    EJB(Enterprise JavaBeans)3.0是Java企业级应用开发的一个重要标准,它定义了如何在Java EE(Java Platform, Enterprise Edition)环境中构建可复用的、组件化的服务器端应用程序。EJB 3.0的发布极大地简化了EJB的...

    EJB3.0开发指南

    ### EJB3.0开发指南知识点详解 #### 一、EJB3.0概述与特点 EJB(Enterprise JavaBeans)3.0是Java EE平台的一部分,用于构建可移植、健壮、重用性强的企业级应用程序。相比于之前的版本,EJB 3.0引入了大量的简化...

    EJB3.0开发文档

    EJB3.0是EJB规范的一个重大改革版本,它极大地简化了开发流程,降低了入门门槛,使其更加符合现代开发模式。本开发文档将深入讲解EJB3.0的关键特性和最佳实践。 一、实体Bean(Entity Beans) 在EJB3.0中,实体Bean...

    2022年EJB 3.0开发指南之多表映射Java教程.docx

    在EJB 3.0开发中,多表映射是一个重要的概念,特别是在处理复杂数据模型时。本教程聚焦于如何使用Java和EJB 3.0标准来映射实体Bean到多个数据库表。EJB(Enterprise JavaBeans)是Java EE平台的一部分,用于构建企业...

    EJB3.0开发Message Driven Bean

    EJB3.0作为Java EE5规范的一部分,引入了许多简化开发的新特性。其中Message-Driven Bean (MDB) 是一种特殊类型的EJB,主要用于接收来自Java消息服务(JMS)的消息。本文将详细介绍如何使用EJB3.0在JBoss IDE中创建和...

    EJB3.0入门经典(PDF)

    《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...

    ejb3.0入门图文教程

    首先,我们来看《EJB3.0开发Entity.pdf》。在EJB 3.0中,Entity Bean代表持久化对象,它存储在数据库中并与数据库进行交互。这个部分将介绍如何定义实体bean,包括使用JPA(Java Persistence API)来注解实体类,...

    jboss ejb3.0开发介绍

    ### jBoss EJB 3.0 开发指南 #### 一、引言 随着 Java 技术的发展,企业级应用的复杂度不断提高,EJB(Enterprise JavaBeans)作为 Java EE 标准的一部分,在构建分布式系统方面扮演着重要的角色。EJB 3.0 相较于...

    精通EJB3.0 pdf

    EJB3.0最显著的改变之一是引入了对注解的支持,这使得开发者可以在类和方法上使用注解来声明EJB的属性和配置,从而极大地简化了EJB组件的创建过程。例如,可以使用`@Stateless`、`@Stateful`和`@Singleton`注解来...

    EJB3.0开发文档+工具

    EJB 3.0是EJB规范的一个重要版本,它极大地简化了EJB的开发模型,使得开发者能够更加专注于业务逻辑,而无需深陷于复杂的API和配置之中。以下是对EJB 3.0开发文档和工具的详细解读: 1. **EJB 3.0的核心特性:** -...

    Java之精通EJB3.0.pdf

    这本书深入浅出地讲解了EJB3.0的核心概念和技术细节,是学习EJB3.0不可或缺的重要参考资料之一。 **主要内容包括:** - EJB3.0的基础概念和发展历程。 - EJB3.0的新特性介绍,如注解、POJO支持等。 - 如何利用EJB...

    2022年EJB 3.0 开发指南之定时服务Java教程.docx

    在EJB 3.0规范中,它引入了许多简化开发的特性,使得开发者可以更轻松地实现业务逻辑。本教程重点讲解的是EJB 3.0中的定时服务功能。 在EJB 2.1中,开发者需要实现如`ejbTimeout`、`ejbPassivate`和`ejbRemove`等...

    EJB3.0开发环境配置

    本文将详细介绍如何配置一个完整的 EJB 3.0 开发环境。 #### 二、运行环境配置 ##### 1、工具下载与安装 为了搭建 EJB 3.0 的开发环境,首先需要准备以下工具: - **JDK 5.0**: Java 开发工具包是必不可少的,...

    EJB3.0.rar_EJB3.0_ejb_ejb 3.0

    **EJB 3.0 开发指南之定时服务** 企业级JavaBeans(Enterprise JavaBeans,简称EJB)是Java平台上用于构建分布式企业级应用程序的重要组件。EJB 3.0作为其一个重要的版本,带来了许多改进,使得开发更加简化且高效...

    2022年EJB 3.0开发指南之依赖注入Java教程.docx

    依赖注入(Dependency ...在EJB 3.0中,这种模式显著简化了开发过程,提高了代码的可重用性和可测试性,是现代Java开发中的一个关键实践。开发者可以通过EJB 3.0的依赖注入特性来构建高效且易于维护的企业级应用。

    ejb2.0与ejb3.0的区别

    ### EJB2.0与EJB3.0的主要区别 #### 一、简介 企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将...

    EJB3.0架包

    EJB3.0是EJB规范的一个重要版本,它在EJB2.x的基础上进行了大量简化,提高了开发效率,并引入了注解驱动的开发方式,使得EJB更易于理解和使用。 在EJB3.0中,主要包含以下关键知识点: 1. **实体Bean(Entity ...

    EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程)

    在"**EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程).txt**"文件中,你将找到一个完整的示例,涵盖了上述所有步骤,包括具体的代码片段和执行过程,这对于初学者来说是一个很好的起点,可以快速理解并实践EJB 3.0在...

    EJB 3.0实例教程.pdf

    EJB 3.0是EJB规范的一个重大革新,它极大地简化了EJB的开发过程,引入了许多面向开发者友好的特性,如注解、依赖注入以及更轻量级的架构。 **1. 注解驱动的开发** 在EJB 3.0之前,开发者需要编写大量的XML配置文件...

Global site tag (gtag.js) - Google Analytics