国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 12:32:58
字體:
來源:轉載
供稿:網友

  在上面的章節我們提到,實體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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 古蔺县| 海门市| 辽源市| 安丘市| 盐山县| 饶平县| 宜良县| 鹤峰县| 辉南县| 伊川县| 耿马| 揭阳市| 朝阳区| 新泰市| 兴城市| 永泰县| 射阳县| 莱州市| 丹棱县| 宾阳县| 双柏县| 阿勒泰市| 平远县| 德州市| 姜堰市| 江城| 垣曲县| 宜兰市| 陆河县| 清涧县| 五指山市| 沾化县| 虞城县| 鸡东县| 雷州市| 广宁县| 长白| 咸宁市| 乌拉特后旗| 会理县| 政和县|