EJB3.0之实体Bean的继承
程序员文章站
2023-12-13 18:42:40
在ejb3.0中,实体bean可以实现继承关系。 比如有个person的实体bean,它有姓名和性别两个属性。 上帝和女娲造人的时候,造出两种人:man和woman。m...
在ejb3.0中,实体bean可以实现继承关系。 比如有个person的实体bean,它有姓名和性别两个属性。
上帝和女娲造人的时候,造出两种人:man和woman。man和woman都是实体bean,而且他们都继承person。
单一表策略就是副实体和子实体的数据都存放在一张表中,同时指定一列用来区别这些实体。
如:
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string)
@discriminatorcolumn(name = "p_type", nullable = true)
@ inheritance的注释声明如下:
@ @target({type}) @retention(runtime)
public @interface inheritance {
inheritancetype strategy() default single_table;
discriminatortype discriminatortype() default string;
string discriminatorvalue() default "";
}
这个注释用来指定继承使用的策略,以及为了区别这些实体所用的列的类型与值。
@discriminatorcolumn注释用在单一表策略和联合表策略上。用来指定区别各实体所需的列。
@target({type}) @retention(runtime)
public @interface discriminatorcolumn {
string name() default "";
boolean nullable() default false;
string columndefinition() default "";
int length() default 10;
}
这个例子主要有以下几个文件,这个例子主要实现了person和man、woman之间的继承关系,下面两章介绍的例子和这个例子相同。man和woman继承person实体bean。前面的例子一样,我们还是使用client测试。
person.java:实体bean。
man.java:实体bean所依赖的类。
woman.java:实体bean所依赖的类。
persontest.java:会话bean的业务接口
persontestbean.java:会话bean的实现类
client.java:测试ejb的客户端类。
jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。
build.xml:ant 配置文件,用以编译、发布、测试、清除ejb。
下面针对每个文件的内容做一个介绍。
person.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.discriminatorcolumn;
import javax.ejb.discriminatortype;
import javax.ejb.entity;
import javax.ejb.generatortype;
import javax.ejb.id;
import javax.ejb.inheritance;
import javax.ejb.inheritancetype;
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string)
@discriminatorcolumn(name = "p_type", nullable = true)
public class person implements java.io.serializable
{
private int id;
private string name;
private string gender;
@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 setgender(string gender)
{
this.gender = gender;
}
public string getgender()
{
return gender;
}
}
指定使用p_type列用来区别各实体bean。
man.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.discriminatortype;
import javax.ejb.entity;
import javax.ejb.inheritance;
import javax.ejb.inheritancetype;
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string, discriminatorvalue = "man")
public class man extends person
{
private boolean isgood;
public void setgood(boolean isgood)
{
this.isgood = isgood;
}
public boolean isgood()
{
return isgood;
}
}
这个实体bean增加了一个是否是好男人的属性。
woman.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.discriminatortype;
import javax.ejb.entity;
import javax.ejb.inheritance;
import javax.ejb.inheritancetype;
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string, discriminatorvalue = "woman")
public class woman extends person
{
private boolean isbeautiful;
public void setisbeautiful(boolean isbeautiful)
{
this.isbeautiful = isbeautiful;
}
public boolean isisbeautiful()
{
return isbeautiful;
}
}
entitytest.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.remote;
import java.util.list;
@remote
public interface persondao
{
public int createman(string name,string gender,boolean b);
public int createwoman(string name,string gender,boolean b);
public person find(int i);
public list findbyname(string name);
public list findbyinfo(string gender);
}
persontestbean.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.entitymanager;
import javax.ejb.inject;
import javax.ejb.stateless;
import java.util.list;
@stateless
public class persondaobean implements persondao
{
@inject
private entitymanager manager;
public int createman(string name,string gender,boolean b)
{
man man = new man();
man.setname(name);
man.setgender(gender);
man.setgood(b);
manager.create(man);
return man.getid();
}
public int createwoman(string name, string gender,boolean b)
{
woman woman = new woman();
woman.setname(name);
woman.setgender(gender);
woman.setisbeautiful(b);
manager.create(woman);
return woman.getid();
}
public person find(int i)
{
return manager.find(person.class,i);
}
public list findbyname(string name)
{
return manager.createquery("from person p where p.name =:name").setparameter("name", name).listresults();
}
public list findbyinfo(string gender)
{
return manager.createquery("from person p where p.gender =:gender").setparameter("gender", gender).listresults();
}
}
在这个会话bean中提供了创建man、woman实体bean的方法,并提供了查找方法。
client.java
package com.kuaff.ejb3.singleinheritance;
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();
persondao dao = (persondao) ctx.lookup(persondao.class.getname());
int i = dao.createman("晁岳攀","男",true);
dao.createwoman("朱立焕","女",true);
person p = dao.find(i);
system.out.printf("%s的性别:%s%n",p.getname(),p.getgender());
list list = dao.findbyname("朱立焕");
for (object o:list)
{
woman w = (woman)o;
system.out.printf("%s漂亮吗?结论:%b%n",w.getname(),w.isisbeautiful());
}
}
}
这个客户端用来测试。
请运行{$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。
上帝和女娲造人的时候,造出两种人:man和woman。man和woman都是实体bean,而且他们都继承person。
单一表策略就是副实体和子实体的数据都存放在一张表中,同时指定一列用来区别这些实体。
如:
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string)
@discriminatorcolumn(name = "p_type", nullable = true)
@ inheritance的注释声明如下:
@ @target({type}) @retention(runtime)
public @interface inheritance {
inheritancetype strategy() default single_table;
discriminatortype discriminatortype() default string;
string discriminatorvalue() default "";
}
这个注释用来指定继承使用的策略,以及为了区别这些实体所用的列的类型与值。
@discriminatorcolumn注释用在单一表策略和联合表策略上。用来指定区别各实体所需的列。
@target({type}) @retention(runtime)
public @interface discriminatorcolumn {
string name() default "";
boolean nullable() default false;
string columndefinition() default "";
int length() default 10;
}
这个例子主要有以下几个文件,这个例子主要实现了person和man、woman之间的继承关系,下面两章介绍的例子和这个例子相同。man和woman继承person实体bean。前面的例子一样,我们还是使用client测试。
person.java:实体bean。
man.java:实体bean所依赖的类。
woman.java:实体bean所依赖的类。
persontest.java:会话bean的业务接口
persontestbean.java:会话bean的实现类
client.java:测试ejb的客户端类。
jndi.properties:jndi属性文件,提供访问jdni的基本配置属性。
build.xml:ant 配置文件,用以编译、发布、测试、清除ejb。
下面针对每个文件的内容做一个介绍。
person.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.discriminatorcolumn;
import javax.ejb.discriminatortype;
import javax.ejb.entity;
import javax.ejb.generatortype;
import javax.ejb.id;
import javax.ejb.inheritance;
import javax.ejb.inheritancetype;
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string)
@discriminatorcolumn(name = "p_type", nullable = true)
public class person implements java.io.serializable
{
private int id;
private string name;
private string gender;
@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 setgender(string gender)
{
this.gender = gender;
}
public string getgender()
{
return gender;
}
}
指定使用p_type列用来区别各实体bean。
man.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.discriminatortype;
import javax.ejb.entity;
import javax.ejb.inheritance;
import javax.ejb.inheritancetype;
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string, discriminatorvalue = "man")
public class man extends person
{
private boolean isgood;
public void setgood(boolean isgood)
{
this.isgood = isgood;
}
public boolean isgood()
{
return isgood;
}
}
这个实体bean增加了一个是否是好男人的属性。
woman.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.discriminatortype;
import javax.ejb.entity;
import javax.ejb.inheritance;
import javax.ejb.inheritancetype;
@entity
@inheritance(strategy = inheritancetype.single_table, discriminatortype = discriminatortype.string, discriminatorvalue = "woman")
public class woman extends person
{
private boolean isbeautiful;
public void setisbeautiful(boolean isbeautiful)
{
this.isbeautiful = isbeautiful;
}
public boolean isisbeautiful()
{
return isbeautiful;
}
}
entitytest.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.remote;
import java.util.list;
@remote
public interface persondao
{
public int createman(string name,string gender,boolean b);
public int createwoman(string name,string gender,boolean b);
public person find(int i);
public list findbyname(string name);
public list findbyinfo(string gender);
}
persontestbean.java
package com.kuaff.ejb3.singleinheritance;
import javax.ejb.entitymanager;
import javax.ejb.inject;
import javax.ejb.stateless;
import java.util.list;
@stateless
public class persondaobean implements persondao
{
@inject
private entitymanager manager;
public int createman(string name,string gender,boolean b)
{
man man = new man();
man.setname(name);
man.setgender(gender);
man.setgood(b);
manager.create(man);
return man.getid();
}
public int createwoman(string name, string gender,boolean b)
{
woman woman = new woman();
woman.setname(name);
woman.setgender(gender);
woman.setisbeautiful(b);
manager.create(woman);
return woman.getid();
}
public person find(int i)
{
return manager.find(person.class,i);
}
public list findbyname(string name)
{
return manager.createquery("from person p where p.name =:name").setparameter("name", name).listresults();
}
public list findbyinfo(string gender)
{
return manager.createquery("from person p where p.gender =:gender").setparameter("gender", gender).listresults();
}
}
在这个会话bean中提供了创建man、woman实体bean的方法,并提供了查找方法。
client.java
package com.kuaff.ejb3.singleinheritance;
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();
persondao dao = (persondao) ctx.lookup(persondao.class.getname());
int i = dao.createman("晁岳攀","男",true);
dao.createwoman("朱立焕","女",true);
person p = dao.find(i);
system.out.printf("%s的性别:%s%n",p.getname(),p.getgender());
list list = dao.findbyname("朱立焕");
for (object o:list)
{
woman w = (woman)o;
system.out.printf("%s漂亮吗?结论:%b%n",w.getname(),w.isisbeautiful());
}
}
}
这个客户端用来测试。
请运行{$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。