麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

精通Hibernate之映射繼承關系三

2019-11-18 12:56:51
字體:
來源:轉載
供稿:網(wǎng)友

  <hibernate-mapping >
  <class name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES">
  <id name="id" type="long" column="ID">
  <generator class="increment"/>
  </id>
  
  <property name="name" type="string" column="NAME" />
  <property name="salary" column="SALARY" type="double" />
  
  <many-to-one
  name="company"
  column="COMPANY_ID"
  class="mypack.Company"
  />
  </class>
  </hibernate-mapping>
  
  由于Employee類沒有相應的映射文件,因此在初始化Hibernate時,只需向Configuration對象中加入Company類、HourlyEmployee類和SalariedEmployee類:
  
  Configuration config = new Configuration();
  config.addClass(Company.class)
  .addClass(HourlyEmployee.class)
  .addClass(SalariedEmployee.class);
  
  14.1.2 操縱持久化對象
  
  這種映射方式不支持多態(tài)查詢,在本書第11章的11.1.6節(jié)(多態(tài)查詢)介紹了多態(tài)查詢的概念。對于以下查詢語句:
  
  List employees=session.find("from Employee");
  
  假如Employee類是抽象類,那么Hibernate會拋出異常。假如Employee類是具體類,那么Hibernate僅僅查詢EMPLOYEES表,檢索出Employee類本身的實例,但不會檢索出它的兩個子類的實例。本節(jié)的范例程序位于配套光盤的sourcecode/chapter14/14.1目錄下,運行該程序前,需要在SAMPLEDB數(shù)據(jù)庫中手工創(chuàng)建COMPANIES表、HE表和SE表,然后加入測試數(shù)據(jù),相關的SQL腳本文件為/14.1/schema/sampledb.sql。
  
  在chapter14目錄下有四個ANT的工程文件,分別為build1.xml、build2.xml、build3.xml和build4.xml,它們的區(qū)別在于文件開頭設置的路徑不一樣,例如在build1.xml文件中設置了以下路徑:
  
  <property name="source.root" value="14.1/src"/>
  <property name="class.root" value="14.1/classes"/>
  <property name="lib.dir" value="lib"/>
  <property name="schema.dir" value="14.1/schema"/>
  
  在DOS命令行下進入chapter14根目錄,然后輸入命令:
  
  ant -file build1.xml run
  
  就會運行BusinessService類。ANT命令的-file選項用于顯式指定工程文件。BusinessService類用于演示操縱Employee類的對象的方法,例程14-4是它的源程序。
  
  例程14-4 BusinessService.java
  
  public class BusinessService{
  public static SessionFactory sessionFactory;
  static{
  try{
  Configuration config = new Configuration();
  config.addClass(Company.class)
  .addClass(HourlyEmployee.class)
  .addClass(SalariedEmployee.class);
  sessionFactory = config.buildSessionFactory();
  }catch(Exception e){e.PRintStackTrace();}
  }
  
  public void saveEmployee(Employee employee) throws Exception{……}
  public List findAllEmployees() throws Exception{……}
  public Company loadCompany(long id) throws Exception{……}
  
  public void test() throws Exception{
  List employees=findAllEmployees();
  printAllEmployees(employees.iterator());
  
  Company company=loadCompany(1);
  printAllEmployees(company.getEmployees().iterator());
  
  Employee employee=new HourlyEmployee("Mary",300,company);
  saveEmployee(employee);
  
  }
  
  private void printAllEmployees(Iterator it){
  while(it.hasNext()){
  Employee e=(Employee)it.next();
  if(e instanceof HourlyEmployee){
  System.out.println(((HourlyEmployee)e).getRate());
  }else
  System.out.println(((SalariedEmployee)e).getSalary());
  }
  }
  public static void main(String args[]) throws Exception {
  new BusinessService().test();
  sessionFactory.close();
  }
  }
  BusinessService的main()方法調(diào)用test()方法,test()方法依次調(diào)用以下方法。
  findAllEmployees():檢索數(shù)據(jù)庫中所有的Employee對象。
  loadCompany():加載一個Company對象。
  saveEmployee():保存一個Employee對象。
  
 ?。?)運行findAllEmployees()方法,它的代碼如下:
  
  List results=new ArrayList();
  tx = session.beginTransaction();
  List hourlyEmployees=session.find("from HourlyEmployee");
  results.addAll(hourlyEmployees);
  
  List salariedEmployees=session.find("from SalariedEmployee");
  results.addAll(salariedEmployees);
  
  tx.commit();
  return results;
  
  為了檢索所有的Employee對象,必須分別檢索所有的HourlyEmployee實例和SalariedEmployee實例,然后把它們合并到同一個集合中。在運行Session的第一個find()方法時,Hibernate執(zhí)行以下select語句:
  
  select * from HOURLY_EMPLOYEES;
  select * from COMPANIES where ID=1;
  
  從HourlyEmployee類到Company類不是多態(tài)關聯(lián),在加載HourlyEmployee對象時,會同時加載與它關聯(lián)的Company對象。
  
  在運行Session的第二個find()方法時,Hibernate執(zhí)行以下select語句:
  
  select * from SALARIED_EMPLOYEES;
  
  從SalariedEmployee類到Company類不是多態(tài)關聯(lián),在加載SalariedEmployee對象時,會同時加載與它關聯(lián)的Company對象。在本書提供的測試數(shù)據(jù)中,所有HourlyEmployee實例和SalariedEmployee實例都與OID為1的Company對象關聯(lián),由于該Company對象已經(jīng)被加載到內(nèi)存中,所以Hibernate不再需要執(zhí)行檢索該對象的select語句。
  
 ?。?)運行l(wèi)oadCompany()方法,它的代碼如下:
  
  tx = session.beginTransaction();
  Company company=(Company)session.load(Company.class,new Long(id));
  
  List hourlyEmployees=session.find("from HourlyEmployee h where h.company.id="+id);
  company.getEmployees().addAll(hourlyEmployees);
  
  List salariedEmployees=session.find("from SalariedEmployee s where s.company.id="+id);
  company.getEmployees().addAll(salariedEmployees);
  
  tx.commit();
  return company;
  
  由于這種映射方式不支持多態(tài)關聯(lián),因此由Session的load()方法加載的Company對象的employees集合中不包含任何Employee對象。BusinessService類必須負責從數(shù)據(jù)庫中檢索出所有與Company對象關聯(lián)的HourlyEmployee對象以及SalariedEmployee對象,然后把它們加入到employees集合中。
  
 ?。?)運行saveEmployee(Employee employee)方法,它的代碼如下:
  
  tx = session.beginTransaction();
  session.save(employee);
  tx.commit();
  
  在test()方法中,創(chuàng)建了一個HourlyEmployee實例,然后調(diào)用saveEmployee()方法保存這個實例:
  
  Employee employee=new HourlyEmployee("Mary",300,company);
  saveEmployee(employee);
  
  Session的save()方法能判定employee變量實際引用的實例的類型,假如employee變量引用HourlyEmployee實例,就向HE表插入一條記錄,執(zhí)行如下insert語句:
  
  insert into HOURLY_EMPLOYEES(ID,NAME,RATE,CUSTOMER_ID)
  values(3, 'Mary',300,1);
  
  假如employee變量引用SalariedEmployee實例,就向SE表插入一條記錄。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 少妇一级淫片高潮流水电影 | 亚洲成年人免费网站 | 免费观看欧美一级片 | 高清av在线 | 日本大片在线播放 | 精品亚洲夜色av98在线观看 | 爱操视频 | 在线成人免费观看www | 一区二区国产在线 | av手机在线免费播放 | 一区国产精品 | 久久电影一区二区 | 欧美一级特级 | 免费毛片播放 | 国产毛片自拍 | 成人一级免费视频 | 久久最新视频 | 高清国产免费 | 久久久久久久久久久亚洲 | 久久久久久片 | 中文字幕欧美专区 | 国产精品欧美久久久久一区二区 | a网站在线 | 欧美激情性色生活片在线观看 | 色人阁五月天 | 国产一国产精品一级毛片 | 日日鲁夜夜视频热线播放 | 黄污视频在线看 | 一本到免费视频 | 国产精品片一区二区三区 | 777sesese| 国产男女爽爽爽爽爽免费视频 | 黄色免费电影网址 | 国产午夜免费福利 | 精品国产观看 | 国产1区视频| 日韩欧美精品电影 | 国产午夜精品一区二区三区不卡 | 欧美亚洲国产一区二区三区 | 欧美第1页| 成人午夜免费国产 |