首页 > 代码库 > Hibernate 多表关联

Hibernate 多表关联

hibernate中可以一次对多个表进行数据插入,这种插入类似

 

Hibernate的关联映射关系有:
多对一 ---- many-to-one
一对多 ---- one-to-many
一对一 ---- one-to-one
多对多 ---- many-to-many

比较常用的是多对一和一对一关联映射多对一关联映射:

场景:用户和组;从用户角度来看,多个用户属于一个组(多对一关联)
使用Hibernate开发的思路:先建立对象模型,把实体抽取出来。目前两个实体:用户和组两个实体,多个学生拥有同一个地址
,所有用户实体中应该有一个持有组的引用

看实体类:

package com.entity;/** * Student entity. @author MyEclipse Persistence Tools */public class Student implements java.io.Serializable {    // Fields    private Integer id;    private String name;    private Integer addid;        private Adrress adss;    // Constructors    public Adrress getAdss() {        return adss;    }    public void setAdss(Adrress adss) {        this.adss = adss;    }    /** default constructor */    public Student() {    }    /** full constructor */    public Student(String name, Integer addid) {        this.name = name;        this.addid = addid;    }    // Property accessors    public Integer getId() {        return this.id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return this.name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAddid() {        return this.addid;    }    public void setAddid(Integer addid) {        this.addid = addid;    }}

 

 

package com.entity;/** * Adrress entity. @author MyEclipse Persistence Tools */public class Adrress implements java.io.Serializable {    // Fields    private Integer idAdrress;    private String detail;    // Constructors    /** default constructor */    public Adrress() {    }    /** full constructor */    public Adrress(String detail) {        this.detail = detail;    }    // Property accessors    public Integer getIdAdrress() {        return this.idAdrress;    }    public void setIdAdrress(Integer idAdrress) {        this.idAdrress = idAdrress;    }    public String getDetail() {        return this.detail;    }    public void setDetail(String detail) {        this.detail = detail;    }}

 

hibernate 映射表的内容

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools --><hibernate-mapping>    <class name="com.entity.Student" table="student" catalog="test">        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="increment"></generator>        </id>        <property name="name" type="java.lang.String">            <column name="Name" length="45" />        </property>                <many-to-one name="adss" column="addid" cascade="save-update" class="com.entity.Adrress"></many-to-one>        <!-- name 属性表示Student类中的属性,column为对应的表中的和adrress表中主键关联的名称,        也就是将address类中的主键的值作为addid的值插入表student中 -->    </class></hibernate-mapping>

 

Spring中配置了事务,利用的是注解的方式

    <bean id="sessionFactoryt"        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">        <!-- 也可以这样配 -->        <!-- <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value>             </property> -->        <property name="dataSource">            <ref bean="dataSource" />        </property>        <property name="hibernateProperties">            <props>                <prop key="hibernate.dialect">                    org.hibernate.dialect.SQLServerDialect                     <!-- 数据库所用的sql语句 -->                </prop>                <prop key="hibernate.show_sql">true</prop>                <prop key="hibernate.format_sql">true</prop>                <prop key="hibernate.cache.use_second_level_cache">true</prop>         <!--启用二级缓存 -->                <prop key="hibernate.cache.use_query_cache">false</prop>              <!--是否启动查询缓存 -->                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>    <!--指定缓存类 -->            </props>        </property>        <!-- <property name="packagesToScan" value="http://www.mamicode.com/com.*" /> 为什么不起作用,别人的就可以 -->        <!-- <property name="mappingResources"> <list> <value>com/entity/Admin.hbm.xml</value>             <value>com/entity/Userinfo.hbm.xml</value> </list> </property> -->        <property name="mappingDirectoryLocations">            <list>                <value>com/entity</value>            </list>        </property>    </bean>
<bean id="tm"        class="org.springframework.orm.hibernate4.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactoryt" />    </bean>

 




<
bean id="userDao" class="com.dao.imp.UserDao"> <property name="sessionFactory" ref="sessionFactoryt" /> </bean><tx:advice id="txAdvice" transaction-manager="tm"> <tx:attributes> <!-- 配置被weave织入的那些方法, 使用的传播行为和隔离级别 --> <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" /> </tx:attributes> </tx:advice> <!-- 6.aop:config--> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.dao.imp.UserDao.*(..))" /> </aop:config> <tx:annotation-driven transaction-manager="tm" />

 

测试代码

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");    UserDao  ud1=(UserDao)ctx.getBean("userDao");//改成userDao就是注解方式的代理

System.out.println("OK");
ud1.insert("liu");

 

 

 

UserDao中的插入数据,因为没有用到接口Spring采用的CGLib代理。

 

public void insert(String s) {                                        System.out.println("插入数据!");        // sessionFactory.openSession().save(arg0)            Admin adm = new Admin();            Session sess = sessionFactory.getCurrentSession();                        Adrress ad = new Adrress();                        ad.setDetail("shan xi");                        Student st = new Student();                        st.setName("liuyu");            st.setAdss(ad);            sess.save(st);            //Transaction tx = sess.beginTransaction();            //tx.begin();            /*Userinfo user = new Userinfo();                                System.out.println("查找数据!");                            // TODO Auto-generated method stub    }

 

 

如果成功,就可以看到如下的语句:

插入数据!Hibernate:     select        max(id)     from        studentHibernate:     select        max(idAdrress)     from        adrress插入数据!Hibernate:     insert     into        test.adrress        (detail, idAdrress)     values        (?, ?)Hibernate:     insert     into        test.student        (Name, addid, id)     values        (?, ?, ?)

 

回到数据库中也可以看到结果。

 

参考:http://blog.csdn.net/fengxuezhiye/article/details/7369786

Hibernate 多表关联