在上面一个例子中,实体bean的属性对应到数据表中的列,都是采用默认的设置。通过column,你可以为属性指定数据表中的列名。
column的声明如下:
| @target({type, method, field}) @retention(runtime) public @interface column { string name() default ""; boolean primarykey() default false; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updatable() default true; string columndefinition() default ""; string secondarytable() default ""; int length() default 255; int precision() default 0; int scale() default 0; boolean specified() default true; // for internal use only } |
entitymanager 是用来处理实体bean的辅助类。它可以用来产生/删除持久化的实体bean,通过主键查找实体bean,通过查询语言来查询实体bean。
下面是entitymanager接口的声明:
| package javax.ejb; import java.sql.connection; /** * 用来和持久化上下文交互的接口 */ public interface entitymanager { /** * 使实体bean受持久化管理 * @param entity */ public void create(object entity); /** * 将给定的实体bean的状态和持久化上下文结合。类似数据库的更新操作。 * @param entity * @return 被结合的实体实例 */ public <t> t merge(t entity); /** * 删除实例 * @param entity */ public void remove(object entity); /** * 根据主键查找. * @param entityname * @param primarykey * @return 查询实例 */ public object find(string entityname, object primarykey); /** * 根据主键查找 * @param primarykey * @return 查询实例 */ public <t> t find(class<t> entityclass, object primarykey); /** * 持久化上下文与底层数据库的同步 */ public void flush(); /** * 执行一个ejbql查询 * @param ejbqlstring ejbql查询语句 * @return the new query instance */ public query createquery(string ejbqlstring); /** * 执行命名的查询 * @param name 预定义的查询名称 * @return 查询实例 */ public query createnamedquery(string name); /** * 执行一个本地sql查询语句 * @param sqlstring 本地查询语句 * @return 返回查询实例 */ public query createnativequery(string sqlstring); /** * 更新到数据库中 * @param entity */ public void refresh(object entity); /** * 持久化上下文中删除实体 * @param entity */ public void evict(object entity); /** * 检查当前上下文中是否包含此实体 * context. * @param entity * @return */ public boolean contains(object entity); } |
@joincolumns
用来指示符合主键,在后面的章节中介绍。
这个例子主要有以下几个文件,这个例子主要实现了管理学生分数的功能。student是一个实体bean,管理学生的基本信息(姓名和各课分数),其中学生的分数又是一个实体bean。tacherbean是一个无状态的会话bean,用来调用实体bean。和前面的例子一样,我们还是使用client测试。
?student.java:实体bean。
?score.java:实体bean。
?teacher.java:会话bean的业务接口
?teacherbean.java:会话bean的实现类
?client.java:测试ejb的客户端类。
?jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。
?build.xml:ant 配置文件,用以编译、发布、测试、清除ejb。
下面针对每个文件的内容做一个介绍。
student.java
| package com.kuaff.ejb3.entity; 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.onetomany; import javax.ejb.table; import java.util.arraylist; import java.util.collection; import java.io.serializable; @entity @table(name = "student") public class student implements serializable { //主键 private int id; //学生名 private string name; //学生的分数 private collection<score> scores; //主键自动产生 @id(generate = generatortype.auto) public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public void addscores(string name,int number) { if (scores == null) { scores = new arraylist<score>(); } score score = new score(); score.setname(name); score.setnumber(number); score.setstudent(this); scores.add(score); } @onetomany(cascade = cascadetype.all, fetch = fetchtype.eager) @joincolumn(name = "student_id") public collection<score> getscores() { return scores; } public void setscores(collection<score> scores) { this.scores = scores; } } |
student.java实现了student实体bean,它提供学生的基本情况以及学生的得分情况,得分是另外一个实体bean。student实体bean和score实体bean是一对多的关系,站在score的角度看是多对一的关系。
实体bean需要使用@entity做注释,另外它指定这个实体bean与表student对应(通过注释@table(name = "student")),你可以在jboss的数据库中看到这个表。
score.java
| package com.kuaff.ejb3.entity; import java.io.serializable; import javax.ejb.entity; import javax.ejb.generatortype; import javax.ejb.id; import javax.ejb.joincolumn; import javax.ejb.manytoone; import javax.ejb.table; @entity @table(name = "score") public class score implements serializable { private int id; private string name; private int number; private student student; //主键自动产生 @id(generate = generatortype.auto) public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public int getnumber() { return number; } public void setnumber(int number) { this.number = number; } @manytoone @joincolumn(name = "student_id") public student getstudent() { return student; } public void setstudent(student student) { this.student = student; } } |
这个实体bean存放学生的分数。
teacher.java
| package com.kuaff.ejb3.entity; import javax.ejb.remote; import javax.ejb.remove; import java.util.map; @remote public interface teacher { public void addscore(string studentname,map<string,integer> map); public student getstudent(); @remove public void leave(); } |
这个会话bean接口提供增加分数和得到用户的方法。
teacherbean.java
| package com.kuaff.ejb3.entity; import javax.ejb.entitymanager; import javax.ejb.inject; import javax.ejb.remove; import javax.ejb.stateful; import java.util.map; import java.util.set; @stateful public class teacherbean implements teacher { @inject private entitymanager manager; private student student; public student getstudent() { return student; } public void addscore(string studentname, map<string,integer> map) { if (student == null) { student = new student(); } student.setname(studentname); set<string> set = map.keyset(); for (string sname:set) { student.addscores(sname,map.get(sname).intvalue()); } } @remove public void leave() { manager.create(student); } } |
这个是会话bean的实现类。
client.java
| package com.kuaff.ejb3.entity; import java.util.map; import java.util.hashmap; import java.util.collection; import javax.naming.initialcontext; import javax.naming.namingexception; public class client { public static void main(string[] args) throws namingexception { initialcontext ctx = new initialcontext(); teacher teacher = (teacher) ctx.lookup(teacher.class.getname()); map<string,integer> map = new hashmap<string,integer>(); map.put("语文",new integer(98)); map.put("化学",new integer(149)); map.put("物理",new integer(143)); teacher.addscore("smallnest",map); student student = teacher.getstudent(); string name = student.getname(); system.out.printf("显示%s的分数:%n",name); collection<score> c = student.getscores(); for (score score:c) { system.out.printf("%s:%s%n",score.getname(),score.getnumber()+""); } } } |
这个客户端增加学生的分数,并且测试显示这个学生的相关信息。
请运行{$jboss_home}/bin目录下的run.bat: run ?cc 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。
闽公网安备 35060202000074号