时间: 2021-07-31 作者:daque
在前方的例子中,咱们演练了一对多和多对一的例子,在本章将演练多对多和一对一的联系。 弟子和教授即是多对多的联系。一个弟子有多个教授,一个教授教多个弟子。 弟子和档案即是一对一的联系(不领会海外的弟子有没有档案?)。 为了实行多对多的联系,数据库中须要关系表,用以在两个实业间创造关系。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 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 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 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 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 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 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 students1 = new hashset(); set students2 = new hashset(); 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); } } } 这个存户端用来尝试。 请运转{$jboss_home}/bin目次下的run.bat: run –c all,启用jboss。 http://localhost:8080/jmx-console/htmladaptor?action=inspectmbean&name=jboss%3aservice%3dhypersonic%2cdatabase%3dlocaldb,而后挪用startdatabasemanager()本领,翻开hsql处置东西处置数据库。 在eclipse的ant视图中实行ejbjar target。大概在吩咐行下,加入到此工程目次下,实行ant ejbjar,将编写翻译打包颁布此ejb。 在eclipse的ant视图中实行run target。大概在吩咐行下,加入到此工程目次下,实行ant run,尝试这个ejb。