<hibernate-mapping ><class name="mypack.Company" table="COMPANIES" ><id name="id" type="long" column="ID"><generator class="increment"/></id><PRoperty name="name" type="string" column="NAME" /></class></hibernate-mapping>
<hibernate-mapping > <class name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES"> <id name="id" type="long" column="ID"> <generator class="increment"/> </id> <property name="name" type="string" column="NAME" /> <property name="rate" column="RATE" type="double" /> <many-to-one name="company" column="COMPANY_ID" class="mypack.Company" /> </class> </hibernate-mapping>
SalariedEmployee.hbm.xml文件用于把SalariedEmployee類映射到SE表,在這個映射文件中,除了需要映射SalariedEmployee類本身的salary屬性,還需要映射從Employee類中繼承的name屬性,此外還要映射從Employee類中繼承的與Company類的關聯關系。例程14-3是SalariedEmployee.hbm.xml文件的代碼。
例程14-3 SalariedEmployee.hbm.xml
由于Employee類沒有相應的映射文件,因此在初始化Hibernate時,只需向Configuration對象中加入Company類、HourlyEmployee類和SalariedEmployee類:
Configuration config = new Configuration();config.addClass(Company.class).addClass(HourlyEmployee.class).addClass(SalariedEmployee.class);
14.1.2 操縱持久化對象
這種映射方式不支持多態查詢,在本書第11章的11.1.6節(多態查詢)介紹了多態查詢的概念。對于以下查詢語句:
List employees=session.find("from Employee");
<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"/>
ant -file build1.xml run
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());}elseSystem.out.println(((SalariedEmployee)e).getSalary());}}public static void main(String args[]) throws Exception {new BusinessService().test();sessionFactory.close();}}BusinessService的main()方法調用test()方法,test()方法依次調用以下方法。findAllEmployees():檢索數據庫中所有的Employee對象。loadCompany():加載一個Company對象。saveEmployee():保存一個Employee對象。
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;
select * from HOURLY_EMPLOYEES;select * from COMPANIES where ID=1;
select * from SALARIED_EMPLOYEES;
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;
tx = session.beginTransaction();session.save(employee);tx.commit();
Employee employee=new HourlyEmployee("Mary",300,company);saveEmployee(employee);
insert into HOURLY_EMPLOYEES(ID,NAME,RATE,CUSTOMER_ID)values(3, 'Mary',300,1);
(出處:http://www.49028c.com)
新聞熱點
疑難解答