学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。
学生和档案就是一对一的关系(不知道国外的学生有没有档案?)。
为了实现多对多的关系,数据库中需要关联表,用以在两个实体间建立关联。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.
闽公网安备 35060202000074号