使用Hibernate做一对多的实体映射(使用面向对象的方式设计表)

来源:互联网 发布:少女终末旅行 知乎 编辑:程序博客网 时间:2024/05/22 03:02

在是使用hibernate一对一的映射关系,如果接触过hibernate的人来说并不陌生,现在我们假设有这样的一个场景
比方说我们要存储学生和老师这两个对象的信息,学生信息,与老师的信息有大部分都是重复的,如果以面向对象的
设计思想来说,我们可以将这部分共有的属性抽象出来一个人类,这样一来我们由原来的两个对象,现在成了三个对象了,肯定会有人说,这样会有什么好处,好处是如果修改人类属性将会影响学生与老师,以便于维护:现在我们来实现刚才的场景我们建两张表

创建teacher表
    create table person(
        id varchar(23) not null primary key,
         username varchar(20) not null,
         userage int,
         sex varchar(2)
       )  


     create table teacher(
           id  varchar(23) not null primary key,
           pay int
       )

    create table student(
           id varchar(23) not null primary key,
           score int
      )
     
我们现在看到的这三张表我们现在要些实体pojo类,写pojo类前我们要看一下表person他是teacher以及student的父类,
在写这个teacher对象以及student对象也要在pojo中体现出来


写person pojo类
public class Person{
        private String id; 
        private String username;
        private int userage,
        private String sex;   
       // 生成get,Set方法我在这里就不写了
     }


现在我们要写teacher和student对象的pojo类,我们已经很清楚的知道teacher与student是person对象的派生类
我们要在pojo中体现

写teacher pojo类


public class Teacher extends Person{
          private int pay;
         // 生成get,Set方法我在这里就不写了
       }


写student pojo类
public class Student extends Person{
          private int score;
         // 生成get,Set方法我在这里就不写了
       }

现在主要写pojo映射文件            Person.hbm.xml

 
<hibernate-mapping package="org.raindrop.hibernate04">

<class name="TItem" table="TITEM">
          <id name="id" column="ID" type="string">
          <generator class="assigned" />
  </id>
                         <property name="username" column="username" type="java.lang.String" not-null="true" />
                         <property name="userage" column="userage" type="java.lang.Integer" />
                        <property name="sex" column="sex" type="java.lang.String" />

  <joined-subclass name="org.raindrop.hibernate04.Teacher" table="teacher">
   <key column="ID"></key>
   <property name="pay" type="java.lang.Integer" column="pay"></property>
  </joined-subclass>

  <joined-subclass name="org.raindrop.hibernate04.Student" table="student">
   <key column="ID"></key>
   <property name="score" type="java.lang.Integer" column="score"></property>
  </joined-subclass>

 </class>
 </hibernate-mapping>
 

建立父类与子类的关系(重点所在)
  <joined-subclass name=""    table="" >   属性name指的是pojo派生的类   table=""指定的是表名
  <key column="id"></key>   通过id将person与person的派生类关联起来
   <property name="pay" type="java.lang.Integer" column="pay"></property>  派生类中的属性

 

操作类PersonOperate.java //teacher和student都是person的子类
 

public void insert(Person person)
 {
        this.session.save(person) ;
       this.session.beginTransaction().commit() ;
       this.session.close() ;
 }


 // 进行按ID查询操作

 public Person queryById(String id)
 {
           Person person = null ;
           String hql = "FROM TItem AS t WHERE t.id=?" ;
           Query q = this.session.createQuery(hql);
           q.setString(0,id) ;
            Iterator iter = q.list().iterator() ;
         if(iter.hasNext())
         {
              person = (TItem)iter.next() ;
         }
         return person;
 }

测试类  向表中插入数据(student对象可以这样插入数据)


               PersonOperate po = new PersonOperate() ;
                 

                  Teacher t=new Teacher();
                   t.SetId("A100");
                   t.SetUsername("zhangshan");
                   t.SetUserage(22);
                   t.SetSex("男");
                   t.SetPay(5000);
        

                   po.insert(t) ;

向表查询数据


      Teacher tea =(Teacher)po.queryById("A100");  
      System.out.println(tea.getId()+"  "+tea.getUsername());