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

Hibernate 多表关联的更多相关文章

  1. Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)

    Set类型的使用: <hibernate-mapping package="cn.model"> <class name="Department&quo ...

  2. hibernate 多表关联外键问题无法截断表的解决办法

    目前只有一个办法 就是手动清除其他表的外键关联,然后在做一个小swing单独去操作这个表,而不运行主控方相关的代码 当web运行后,外键会再次设置好

  3. Hibernate 多表关联映射- 一对多关系映射(one-to-many)

    Hibernage.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

  4. hibernate多表关联CascadeType类型的选择

    CascadeType.REMOVE//慎用 Cascade remove operation,级联删除操作.删除当前实体时,与它有映射关系的实体也会跟着被删除. CascadeType.MERGE ...

  5. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  6. hibernate的基础学习--多表关联数据查询

    Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...

  7. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  8. Hibernate中一对一关联映射/组件映射

    Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...

  9. atitit.atitit.hb many2one relate hibernate 多对一关联配置..

    atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2.  ...

随机推荐

  1. Redis集群明细文档

    Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式).目前根据文档已经看到Redis正在开发集群功能,其中一 ...

  2. oracle 子查询因子化 浅谈(with的使用)

    近来学习oracle,想要提高自己所写语句的效率和易读性,今天的笔记是关于子查询因子话这么一个东西 因子化的查询不一定可以提高效率,但是一定可以再提高程序的可读性方面成效显著 --with 语句 wi ...

  3. Rac & DG

    Rac环境: RAC版本异同:[10R2,11R1(和10类似)],11R2,12c: 目录: 10.2的ASM需要单独的目录(oracle home):rdbms home,asm home, cr ...

  4. c++中new分配动态数组

    变长一维数组     这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组.实现变长数组最简单的是变长一维数组,你可以这样做:  //文件名: array01.cpp ...

  5. CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.13+博客系统WordPress3.3.2

    说明: 操作系统:CentOS 6.2 32位 系统安装教程:CentOS 6.2安装(超级详细图解教程): http://www.osyunwei.com/archives/1537.html 准备 ...

  6. Team Homework #3

    我们组采访了以下几组学长学姐.因为隐私问题我们不会写出他们的个人信息. 1:平均每周所花时间:10:平均写的代码总数:2000:最有用的部分:锻炼团队合作精神:最没用的部分:写博客:改进:完全不需要博 ...

  7. iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述

    本文档尝试用Video Toolbox进行H.265(HEVC)硬件编码,视频源为iPhone后置摄像头.去年做完硬解H.264,没做编码,技能上感觉有些缺失.正好刚才发现CMFormatDescri ...

  8. android 开发edittext获取焦点时hint消失

    默认情况时:设置了hint的话,需要输入的时候hint才会消失,但是现在是需要当edittext获取焦点时就让hint消失 代码如下: verifycode= (EditText)findViewBy ...

  9. UVA 714 Copying Books 二分

    题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...

  10. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...