关联映射的关系(一对多)

关联映射的关系(一对多)

1、  一对多:

一对多关联的分析:在部门Dempartment中设置属性的时候要设置员工Employee对象,而Employee是多个,所以用集合存储起来,在建立实体类的时候,只需在Dempartment类中多写一个:Set<Employee> emps;属性就可以了。

注:不管是多对一还是一对多,实体类所映射的数据库表中的结构是一样的,因为他们就是相同的,就是所站的角度不同而已

 

完成一对多关联的实例操作的源代码及其解析:(一对多关联和多对一的操作步骤其实是差不多的。)

(1)首先在domain包下新建Department类,Employee类

       在Department.java中:

a)要在Department.java类中封装属性 id,name

       b)给这两个属性生成getter和setter方法

       c) //集合属性反应的是一对多

    private Set<Employee> emps;并且生成setter和getter方法

       在Employee.java中:

a)       要在Employee.java类中封装id, name,还有一个Department类型的depart属性

b)      生成getter和setter方法

(2)编写映射文件,可根据根目录下的模板进行编写。要写这样两个映射文件:Department.hbm.xml。Employee.hbm.xml

       a) Department.hbm.xml映射文件内容:    

<!-- 实体类所在的包 -->

<hibernate-mapping

    package="com.hbsi.domain">

<!-- 实体类的名字,如果表名和实体类的类名一样的话,那么就可以把table属性缺省 -->

    <class name="Department" table="department">

<!-- Java类中的属性怎样和二维表中的字段建立关系,id是主键,特殊 .-1瞬时状态,非-1脱管状态--> 

       <id name="id" column="id">

<!-- 主键的一个生成器,主键生成器native,自增长的 -->

           <generator class="native"/>

       </id>

       <property name="name" column="name"/>

      

       <!-- 对集合属性进行映射 -->

       <set name="emps">

       <key column="depart_id"></key>

       <one-to-many class="Employee"/>

       </set>

    </class>

</hibernate-mapping>

b)Employee.hbm.xml映射文件:

<!-- 实体类所在的包 -->

<hibernate-mapping

    package="com.hbsi.domain">

<!-- 实体类的名字,如果表名和实体类的类名一样的话,那么就可以把table属性缺省 -->

    <class name="Employee" table="employee">

<!-- Java类中的属性怎样和二维表中的字段建立关系,id是主键,特殊 .-1瞬时状态,非-1脱管状态--> 

       <id name="id" column="id">

<!-- 主键的一个生成器,主键生成器native,自增长的 -->

           <generator class="native"/>

       </id>

       <property name="name" column="name"/>

    </class>

</hibernate-mapping>

(3)第三步编写配置文件,也可根据模板代码,将配置文件写入到配置文件中hibernate.cfg.xml。

       <hibernate-configuration>

    <session-factory>

       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

       <property name="hibernate.connection.url">jdbc:mysql:///user</property>

       <property name="connection.username">root</property>

       <property name="connection.password">1234</property>

       <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

       <property name="hibernate.hbm2ddl.auto">create</property>

       <property name="hibernate.show_sql">true</property>

       <mapping resource="com/hbsi/domain/Department.hbm.xml"/>

       <mapping resource="com/hbsi/domain/Employee.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

(4)工具类的编写,这样的代码我们都可以参照hibetnate工具类的模板代码的。

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

//工具类

public final class HibernateUtil {

       private static SessionFactory sessionFactory;

       private HibernateUtil(){

             

       }

       static{

              Configuration cfg=new Configuration();

              cfg.configure();

              sessionFactory=cfg.buildSessionFactory();

       }

       public static SessionFactory getSessionFactory() {

              return sessionFactory;

       }

       public static Session getSession(){

              return sessionFactory.openSession();

       }

}

(5)最后一步,我们就要编写测试类,来进行我们的测试了。编写测试类:One2Many.java

       那么我们就来举例来编写一个增加员工的操作的方法:

       static Department add(){

       Session s=null;

       Transaction tx=null;

       try{

           //得到session对象

           s=HibernateUtil.getSession();

           tx=s.beginTransaction();

           //增加

           Department dep=new Department();

           dep.setName("depart one");

          

           Employee e1=new Employee();

           e1.setName("Tom");

           e1.setDepart(dep);//使得对象模型中:对象之间有了相应的关联

          

           Employee e2=new Employee();

           e2.setName("Jerry");

           e2.setDepart(dep);//员工对象和部门对象就建立了关联

           //保存

           s.save(dep);

           s.save(e1);

           s.save(e2);

           //提交事务

           tx.commit();

           return dep;

       }finally{

           if(s!=null){

              s.close();

           }

       }

    }

在我们的main()方法中就可以调用add();这个方法了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值