服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

ejb3.0开发指南之实体bean的继承

  在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 ?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。

扫描关注微信公众号