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
Hibernate 多表关联的更多相关文章
- Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)
Set类型的使用: <hibernate-mapping package="cn.model"> <class name="Department&quo ...
- hibernate 多表关联外键问题无法截断表的解决办法
目前只有一个办法 就是手动清除其他表的外键关联,然后在做一个小swing单独去操作这个表,而不运行主控方相关的代码 当web运行后,外键会再次设置好
- Hibernate 多表关联映射- 一对多关系映射(one-to-many)
Hibernage.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
- hibernate多表关联CascadeType类型的选择
CascadeType.REMOVE//慎用 Cascade remove operation,级联删除操作.删除当前实体时,与它有映射关系的实体也会跟着被删除. CascadeType.MERGE ...
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
- hibernate的基础学习--多表关联数据查询
Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate中一对一关联映射/组件映射
Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...
- atitit.atitit.hb many2one relate hibernate 多对一关联配置..
atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2. ...
随机推荐
- WPF学习笔记1——XAML之1
参考文献: http://msdn.microsoft.com/zh-cn/library/ms752059(v=vs.110).aspx <Pro WPF 4.5 in C# > 一.X ...
- 从零开始学ios开发(七):Delegate,Action Sheet, Alert
Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从 ...
- 活动图 Activity Diagram
活动图 可通过一系列操作将业务流程或软件进程以工作流的形式显示出来.这些操作可以由人.软件组件或计算机来执行. 使用活动图可以描述多种类型的流程,如下: 1.用户和您的系统之间的业务流程或工作流. 2 ...
- 使用ASP.NET注册工具aspnet_regiis.exe注册IIS
该工具的名称为aspnet_regiis.exe,在32位机上,该工具存在于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,在64位机中“Framework ...
- Version of SQLite used in Android?
sing the emulators (adb shell sqlite3 --version): SQLite 3.7.11: 19-4.4-KitKat 18-4.3-Jelly Bean 17- ...
- WebClient
Mircsoft在dotnet1.1框架下提供的向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法.通过这个类,大家可以在脱离浏览器的基础上模拟浏览器对互联网上的资源的访问和发送 ...
- Visual Studio 2013无法打开IIS Express Web的解决办法
1. 首先参考了http://www.cr173.com/html/33412_1.html 2. 参考其最后,从微软官网下载安装WebMatrix,打开WebMatrix. 3. Visual St ...
- sqlserver oracle 时间加减
sqlserver: 减去10小时: dateadd(hour,-10,Your_date) oracle : 减去10小时: sysdate()-10/24
- C# IL DASM 使用
IL DASM反编译工具 使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识.我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改.感觉他还是很强大. IL ...
- 【BZOJ】【1391】【CEOI2008】order
网络流/最小割 暴力建图就好了……S->i 容量为收益,i->j+n 容量为租金,j+n->T容量为购买所花的钱. 如果亏钱的话那么割掉的就是收益,表示不赚钱. 如果租金大于购买所花 ...