学生和档案就是一对一的关系(不知道国外的学生有没有档案?)。
为了实现多对多的关系,数据库中需要关联表,用以在两个实体间建立关联。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的注释声明如下: public @interface AssociationTable { |
关联表注释指定了关联表的名称、主表的列和从表的列。
为了实现一对一的关系,需要用@OneToOne来注释。
如:
| @OneToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "DOSSIER_ID") public Dossier getDossier() |
这定义了一个单向的一对一的关系。如果在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; @Entity @Table(name = "STUDENT") public class Student implements Serializable { @Id(generate = GeneratorType.AUTO) public int getId() public void setId(int id) public void setFirst(String first) public String getFirst() public void setLast(String last) public String getLast() public void setDossier(Dossier dossier) @OneToOne(cascade = {CascadeType.ALL}) public Dossier getDossier() public void setTeacher(Set teachers) @ManyToMany(cascade = {CascadeType.CREATE, CascadeType.MERGE}, fetch = FetchType.EAGER, isInverse = true) joinColumns = {@JoinColumn(name = "TEACHER_ID")},inverseJoinColumns = {@JoinColumn(name = "STUDENT_ID")}) public Set getTeacher() Dossier.java package com.kuaff.ejb3.relationships; import javax.ejb.Entity; @Entity public class Dossier implements java.io.Serializable @Id(generate = GeneratorType.AUTO) public void setId(Long id) public void setResume(String resume) public String getResume() Teacher.java package com.kuaff.ejb3.relationships; import javax.ejb.AssociationTable; @Entity public class Teacher implements java.io.Serializable @Id(generate = GeneratorType.IDENTITY) public Long getId() public void setId(Long id) public void setName(String name) public String getName() public void setInfo(String info) public String getInfo() public void setStudents(Set students) @ManyToMany(cascade = {CascadeType.CREATE, CascadeType.MERGE}, fetch = FetchType.EAGER) public Set getStudents() EntityTest.java package com.kuaff.ejb3.relationships; import javax.ejb.Remote; @Remote public interface EntityTest EntityTestBean.java import javax.ejb.EntityManager; @Stateless public class EntityTestBean implements EntityTest Set students1 = new HashSet(); Dossier dossier1 = new Dossier(); student1.setFirst("晁"); student2.setFirst("赵"); student3.setFirst("田"); dossier3.setResume("这是田明的档案"); teacher1.setStudents(students1); } public List findByName(String name) } |

RSS订阅




