Hibernate 多表关联

简介: hibernate中可以一次对多个表进行数据插入,这种插入类似   Hibernate的关联映射关系有:多对一 ---- many-to-one一对多 ---- one-to-many一对一 ---- one-to-one多对多 ---- many-to-many 比较常用的是多对一和一对一关联映射多对一关联映射: 场景:用户和组;从用户角度来看,多个用户属于一个组(多对一关联)使用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="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
        student
Hibernate: 
    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

相关文章
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
217 1
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
237 1
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
370 0
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
485 0
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
214 1
|
SQL Java 关系型数据库
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
180 2
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
260 0