欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EJB3.0之实体Bean的继承

程序员文章站 2024-02-22 18:32:10
在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。