love fish大鵬一曰同風起,扶搖直上九萬里

          導航

          <2006年7月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          公告

          留言簿(15)

          隨筆分類(493)

          隨筆檔案(498)

          相冊

          閱讀排行榜

          常用鏈接

          統計

          積分與排名

          friends

          link

          最新評論

          EJB 3.0 開發指南之依賴值對象

          在上面的章節我們提到,實體bean的屬性可以是java基本對象、Date等,事實上,實體Bean的屬性也可以是其他的java對象。這些Java對象不能直接從持久化上下文中讀取,它依賴于主實體bean。不象關聯實體Bean,在EJB3.0中不支持依賴值對象的集合。

            依賴值對象不支持繼承,這將在EJB3.1中在討論。

            依賴類需要使用◎DependentObject來注釋:

          @Target({TYPE}) @Retention(RUNTIME)
          public @interface DependentObject {
           AccessType access() default PROPERTY;
          }

            這個注釋可以指定容器訪問這個類的方法,是通過屬性還是直接通過字段來訪問。

            在實體Bean的一個屬性需要使用依賴值對象,那么這個屬性的get方法需要使用@Dependent注釋:

          @Target({METHOD, FIELD}) @Retention(RUNTIME)
          public @interface Dependent {
           DependentAttribute[] value() default {};
          }

            這個注釋可以指定依賴的屬性DependentAttribute:

          @Target({}) @Retention(RUNTIME)

          public @interface DependentAttribute {
           String name();
           Column[] column() default {};
          }

            可以指定屬性名稱和映射的列名。這里,一個主實體Bean的屬性可以映射到數據表中的多列。

            如果你還不太明白,看下面的例子。

            這個例子主要有以下幾個文件,這個例子主要實現了管理學生的功能。Student是一個實體Bean,這個Bean的name屬性是一個類,也就是Name類,這個Name類就是一個依賴值對象。StudentDAOBean是一個無狀態的會話Bean,用來調用實體Bean。和前面的例子一樣,我們還是使用Client測試。

            ·Student.java:實體Bean。

            ·Name.java:實體Bean所依賴的類。

            ·StudentDAO.java:會話Bean的業務接口

            ·StudentDAOBean.java:會話Bean的實現類

            ·Client.java:測試EJB的客戶端類。

            ·jndi.properties:jndi屬性文件,提供訪問jdni的基本配置屬性。

            ·Build.xml:ant 配置文件,用以編譯、發布、測試、清除EJB。

            下面針對每個文件的內容做一個介紹。

            Student.java

          package com.kuaff.ejb3.dependent;

          import javax.ejb.Dependent;
          import javax.ejb.DependentAttribute;
          import javax.ejb.Column;
          import javax.ejb.Entity;
          import javax.ejb.GeneratorType;
          import javax.ejb.Id;
          import javax.ejb.Table;

          @Entity @Table(name = "STUDENT") public class Student implements java.io.Serializable
          {
           private int id;
           private Name name;
           private String grade;
           private String email;

           @Id(generate = GeneratorType.AUTO)

           public int getId()
           {
            return id;
           }

           public void setId(int id)
           {
            this.id = id;
           }

           public void setName(Name name)
           {
            this.name = name;
           }

          @Dependent(
          { @DependentAttribute(name = "first", column ={ @Column(name = "FIRST") }),
           @DependentAttribute(name = "last", column ={ @Column(name = "LAST") }) })
           public Name getName()
           {
            return name;
           }

           public void setGrade(String grade)
           {
            this.grade = grade;
           }

           @Column(name = "GRADE")

           public String getGrade()
           {
            return grade;
           }

           public void setEmail(String email)
           {
            this.email = email;
           }

           @Column(name = "EMAIL")

           public String getEmail()
           {
            return email;
           }
          }

            Student.java實現了Student實體Bean,它提供學生的基本情況。學生的姓名是Name類,通過@Dependent(

          { @DependentAttribute(name = "first", column ={ @Column(name = "FIRST") }),

          @DependentAttribute(name = "last", column ={ @Column(name = "LAST") }) })

          來聲明,并指定這個依賴類的兩個屬性first和last,并映射到數據表的FIRST和LAST列上。

            Name.java

          package com.kuaff.ejb3.dependent;

          import java.io.Serializable;
          import javax.ejb.AccessType;
          import javax.ejb.DependentObject;

          @DependentObject(access = AccessType.PROPERTY)

          public class Name implements java.io.Serializable
          {
           private String first;
           private String last;

           public Name()
           {}

           public Name(String first, String last)
           {
            this.first = first;
            this.last = last;
           }

           public String getFirst()
           {
            return first;
           }

           public void setFirst(String first)
           {
            this.first = first;
           }

           public String getLast()
           {
            return last;
           }

           public void setLast(String last)
           {
            this.last = last;
           }
          }

            這個值對象也很簡單,和一般的javaBean差不多,但有兩個地方需要注意:

            1. 這個類實現了java.io.Serializable接口

            2. 這個類使用@DependentObject做了注釋

            StudentDAO.java

          package com.kuaff.ejb3.dependent;

          import javax.ejb.Remote;
          import java.util.List;

          @Remote

          public interface StudentDAO
          {
           int create(String first, String last, String grade, String email);
           Student find(int id);
           List findByFirstName(String name);
           List findByLastName(String name);
           List findByEmail(String email);

           void merge(Student s);
          }

            這個會話Bean接口提供查找用戶的方法。

            StudentDAOBean.java

          package com.kuaff.ejb3.dependent;

          import java.util.List;
          import javax.ejb.EntityManager;
          import javax.ejb.Inject;
          import javax.ejb.Stateless;

          @Stateless

          public class StudentDAOBean implements StudentDAO
          {
           @Inject
           private EntityManager manager;

           public int create(String first, String last, String grade, String email)
           {
            Student student = new Student();
            student.setName(new Name(first,last));
            student.setGrade(grade);
            student.setEmail(email);
            manager.create(student);
            return student.getId();
           }

           public Student find(int id)
           {
            return manager.find(Student.class, id);
           }

           public List findByFirstName(String name)
           {
            return manager.createQuery("from Student s where s.name.last = :name").setParameter("name", name).listResults();
           }
           public List findByLastName(String name)
           {
            return manager.createQuery("from Student s where s.name.first = :name").setParameter("name", name).listResults();
           }

           public List findByEmail(String email)
           {
             return manager.createQuery("from Student s where s.email = :email").setParameter("email", email).listResults();
           }

           public void merge(Student s)
           {
            manager.merge(s);
           }

          }

            這個是會話Bean的實現類。可以看到根據值對象的屬性查找主實體Bean。

            Client.java

          package com.kuaff.ejb3.dependent;

          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.findByEmail("zhuzhu@kuaff.com");
            for(Object o:list)
            {
             Student s = (Student)o;
             System.out.printf("%s %s的email:%s%n",s.getName().getFirst(),s.getName().getLast(),s.getEmail());
            }
           }
          }

            這個客戶端增加學生的分數,并且測試顯示這個學生的email。

            請運行{$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?;蛘咴诿钚邢拢M入到此工程目錄下,執行ant run,測試這個EJB。

          posted on 2006-07-04 09:25 liaojiyong 閱讀(303) 評論(0)  編輯  收藏 所屬分類: EJB

          主站蜘蛛池模板: 新绛县| 怀来县| 福贡县| 乌拉特中旗| 内丘县| 密山市| 桐乡市| 抚远县| 襄汾县| 罗城| 盐边县| 富顺县| 莱州市| 饶阳县| 博罗县| 木兰县| 刚察县| 富阳市| 兴海县| 延吉市| 井冈山市| 平山县| 扶余县| 荥阳市| 绿春县| 永和县| 栾城县| 云和县| 赣州市| 资阳市| 文昌市| 忻城县| 兴安县| 绥江县| 华蓥市| 哈尔滨市| 辛集市| 靖边县| 若尔盖县| 万年县| 泽州县|