hibernate进阶--一对多映射配置
hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选。虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码也足够复杂,且存在大量重复。所以有了ORM框架,让Java程序员可以从 SQL语句中解放,Hibernate就是其中的翘楚。Hibernate将JDBC进一步的封装了,在SQL的可移植性方面表现优秀,并且使 Hibernate程序代码足够简化。
ORM(对象关系映射)是面向对象程序员在代码的编写过程中更舒服,不用处理繁杂的SQL,每个对象映射到数据库中的一条记录,一个实体类对应数据库里的一张表,所有这些都让面向对象程序员处理起来得心应手。Hibernate的开发环境搭建我已经在另一篇博客中介绍了,本文主要介绍一下Hibernate的基本配置与使用。
关于session的获取、以及基本的增删改查操作:
- @Before
- public void init(){
- config = new Configuration().configure();
- serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
- sessionFactory = config.buildSessionFactory(serviceRegistry);
- session = sessionFactory.openSession();
- transaction = session.getTransaction();
- transaction.begin();
- }
上 面这段代码主要是session的获取以及开启事务,Hibernate的CRUD都是在事务中进行的,如果不开启事务所有的操作都不会主动提交到数据库 的。关于CRUD操作,在session中有对应的API,不但功能强大而且使用方便,包括:save,update,delete,get,load 等,其中注意get和load方法:get会直接获取数据库记录对象、load则是生成代理对象,只有该对象在被第一次使用的时候才向数据库发送SQL语 句,真正的获得对象。当然还包括其他一些强大的API我们以后在学习。
配置---Hibernate的核心:
Hibernate最主要的就是配置了,首先就是hibernate.cfg.xml文件,如以前环境搭建时讲到的一样,关于数据库的基本配置信息都要在
该文件中配置好,包括对数据源的支持等以及实体类与数据表的映射关系。另一个重要的配置文件为XXX.hbm.xml文件,主要配置的是数据表与实体类之
间的映射关系,如下面User类与USER表之间的对应:
- <hibernate-mapping>
- <class name="com.song.hibernate.User" table="USER">
- <id name="id" type="int">
- <column name="ID" />
- <generator class="assigned" />
- </id>
- <property name="uname" type="java.lang.String">
- <column name="UNAME" />
- </property>
- <property name="birth" type="java.util.Date">
- <column name="BIRTH" />
- </property>
- </class>
- </hibernate-mapping>
下文主要介绍xxx.hbm.xml文件的配置:
首先,数据类型,Java的数据类型与数据库的数据类型并不是一一对应的,所以就有了hibernate的中间类型:
| Java数据类型 | Hibernate数据类型 | 标准SQL数据类型 (PS:对于不同的DB可能有所差异) |
| byte、java.lang.Byte | byte | TINYINT |
| short、java.lang.Short | short | SMALLINT |
| int、java.lang.Integer | integer | INGEGER |
| long、java.lang.Long | long | BIGINT |
| float、java.lang.Float | float | FLOAT |
| double、java.lang.Double | double | DOUBLE |
| java.math.BigDecimal | big_decimal | NUMERIC |
| char、java.lang.Character | character | CHAR(1) |
| boolean、java.lang.Boolean | boolean | BIT |
| java.lang.String | string | VARCHAR |
| boolean、java.lang.Boolean | yes_no | CHAR(1)('Y'或'N') |
| boolean、java.lang.Boolean | true_false | CHAR(1)('Y'或'N') |
| java.util.Date、java.sql.Date | date | DATE |
| java.util.Date、java.sql.Time | time | TIME |
| java.util.Date、java.sql.Timestamp | timestamp | TIMESTAMP |
| java.util.Calendar | calendar | TIMESTAMP |
| java.util.Calendar | calendar_date | DATE |
| byte[] | binary | VARBINARY、BLOB |
| java.lang.String | text | CLOB |
| java.io.Serializable | serializable | VARBINARY、BLOB |
| java.sql.Clob | clob | CLOB |
| java.sql.Blob | blob | BLOB |
| java.lang.Class | class | VARCHAR |
| java.util.Locale | locale | VARCHAR |
| java.util.TimeZone | timezone | VARCHAR |
| java.util.Currency | currency | VARCHAR |
一般我们使用hibernate的中间类型,但是也可以使用Java类型。比如java.util.Date类型并不能详细表达该date类型是日期还是
时间还是日期+时间的形式,而hibernate中间类型就有详细的区分:date表示日期,time表示时间,timestamp表示日期+时间类型。
配置主键的生成策略:
在配置文件中<generator class="assigned" />标签代表主键的生成策略,最常用的是assigned和native:
assigned:由程序控制、就是手动赋值
native:根据数据库类别使用其原生的主键生成方式,MySQL是auto_increment;
还有几种生成策略,identity自增的方式、sequence适用于oracle的sequence方式、hilo使用hige/low算法生成主键、还有包括seqhilo、uuid.hex、guid、select等以后用到再说。
配置映射关系:
- 单向一对多映射:班级grade与学生student就是一对多的映射关系,通过班级可以查到属于该班级的所有学生,即一个班级对应多个学生,这就是单向的一对多,grade------>students
- 单向多对一映射:同样的通过每个学生可以查找到他的班级,这就是单向的多对一,即多个学生对应一个班级,students----->grade
- 双向的一对多映射:就是两者结合,通过一个班级可以查找到所有属于该班级的学生并且通过每个学生可以查找到他们所属的班级,几一个班级对应多个学生且多个学生对应一个班级
以grade和students为例来学习hibernate的一对多映射关系配置:
首先是准备阶段,创建数据表grade 和 student:
- create table grade(
- gid int,
- gname varchar(20) not null,
- gdesc varchar(40)
- );
- create table student(
- sid int,
- sname varchar(20) not null,
- sex varchar(2),
- gid int
- );
- alter table student add constraint fk_student-gid foregin key (gid) references grade (gid);
然后创建两个对应的实体类:
在单向一对多中:
- public class Grade{
- private int gid;
- private String gname;
- private String gdesc;
- private Set<Student> students;
- //对应的getter、setter方法 构造器、及其他测试需要的toString方法等
- }
- public class Student{
- private int sid;
- private String sname;
- private String sex;
- //对应的getter、setter方法 构造器、及其他测试需要的toString方法等
- }
因为是单向的一对多关系,所以在Student类中不会含有grade的引用;
对应生成的hbm.xml文件如下:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.song.entity.Grade" table="GRADE">
- <id name="gid" type="int">
- <column name="GID" />
- <generator class="assigned" />
- </id>
- <property name="gname" type="java.lang.String">
- <column name="GNAME" />
- </property>
- <property name="gdesc" type="java.lang.String">
- <column name="GDESC" />
- </property>
- <set name="students" table="STUDENT" >
- <key>
- <column name="GID" />
- </key>
- <one-to-many class="com.song.entity.Student" />
- </set>
- </class>
- </hibernate-mapping>
Students.hbm.xml:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.song.entity.Student" table="STUDENT">
- <id name="sid" type="int">
- <column name="SID" />
- <generator class="assigned" />
- </id>
- <property name="sname" type="java.lang.String">
- <column name="SNAME" />
- </property>
- <property name="sex" type="java.lang.String">
- <column name="SEX" />
- </property>
- </class>
- </hibernate-mapping>
在单向多对一中:
与单向一对多相反,这次单方不用持有一方的集合引用;
- public class Grade{
- private int gid;
- private String gname;
- private String gdesc;
- //对应的getter、setter方法 构造器、及其他测试需要的toString方法等
- }
- public class Student{
- private int sid;
- private String sname;
- private String sex;
- private Grade grade;
- //对应的getter、setter方法 构造器、及其他测试需要的toString方法等
- }
可以通过学生来查询到其所在的班级,对应的hbm.xml配置如下:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.song.entity.Student" table="STUDENT">
- <id name="sid" type="int">
- <column name="SID" />
- <generator class="assigned" />
- </id>
- <property name="sname" type="java.lang.String">
- <column name="SNAME" />
- </property>
- <property name="sex" type="java.lang.String">
- <column name="SEX" />
- </property>
- <many-to-one name="grade" class="com.song.entity.Grade" >
- <column name="GID" />
- </many-to-one>
- </class>
- </hibernate-mapping>
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.song.entity.Grade" table="GRADE">
- <id name="gid" type="int">
- <column name="GID" />
- <generator class="assigned" />
- </id>
- <property name="gname" type="java.lang.String">
- <column name="GNAME" />
- </property>
- <property name="gdesc" type="java.lang.String">
- <column name="GDESC" />
- </property>
- </class>
- </hibernate-mapping>
class Grade{
- private int gid;
- private String gname;
- private String gdesc;
- private Set<Student> students;
- //对应的getter、setter方法 构造器、及其他测试需要的toString方法等
- }
- public class Student{
- private int sid;
- private String sname;
- private String sex;
- private Grade grade;
- //对应的getter、setter方法 构造器、及其他测试需要的toString方法等
- }
在hbm.xml文件中也是要两端同时配置单向一对多和单向多对一:
- <hibernate-mapping>
- <class name="com.song.entity.Grade" table="GRADE">
- <id name="gid" type="int">
- <column name="GID" />
- <generator class="assigned" />
- </id>
- <property name="gname" type="java.lang.String">
- <column name="GNAME" />
- </property>
- <property name="gdesc" type="java.lang.String">
- <column name="GDESC" />
- </property>
- <set name="students" table="STUDENT" inverse="true" cascade="save-update">
- <key>
- <column name="GID" />
- </key>
- <one-to-many class="com.song.entity.Student" />
- </set>
- </class>
- </hibernate-mapping>
- <hibernate-mapping>
- <class name="com.song.entity.Student" table="STUDENT">
- <id name="sid" type="int">
- <column name="SID" />
- <generator class="assigned" />
- </id>
- <property name="sname" type="java.lang.String">
- <column name="SNAME" />
- </property>
- <property name="sex" type="java.lang.String">
- <column name="SEX" />
- </property>
- <many-to-one name="grade" class="com.song.entity.Grade" cascade="all">
- <column name="GID" />
- </many-to-one>
- </class>
- </hibernate-mapping>

其中设置了在“一”端inverse属性,默认为false这里设为true,用来优化,交给多段来维护对应关系。
还有cascade:代表级联操作,默认为none,就是不级联
save-update代表在save和update时级联、delete代表在删除时级联、all代表什么情况都级联。
转:http://blog.csdn.net/weiguang111/article/details/50521917
hibernate进阶--一对多映射配置的更多相关文章
- Java进阶知识03 Hibernate的基础配置详解
1.Hibernate的原理/流程步骤 1.通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件,并创建一个configuration对象 ...
- Hibernatede 一对多映射配置
Hibernatede 一对多映射配置 以公司和员工为例:公司是一,员工是多 第一步 创建两个实体类,公司和员工 写核心配置文件hibernate.cfg.xml 写映 ...
- Hibernate进阶学习3
Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...
- hibernate之一对多映射
目录 第一章 课程简介 第二章 Hibernate中的单向一对多关联 2-1 一对多映射简介 2-2 hibernate的基础配置 2-3 创建HibernateUtil工具类 2-4 在mysql数 ...
- Hibernate初探之单表映射——第二章:Hibernate进阶
第二章:Hibernate进阶 1.hibernate.cfg.xml常用配置 2.session 简介 3.transaction简介 4.session详解 5.对象关系映射常用配置 1.hibe ...
- JAVA spring hibernate 多数据源配置记录
数据源配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- hibernate.hbm2ddl.auto配置详解
hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下:<properties><property name="hibernate. ...
- (Hibernate进阶)Hibernate系列——总结篇(九)
这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
- 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置
一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...
随机推荐
- asp.net和脚本获取当前的URL、IP地址
介绍一下ASP.NET取得当前页面的完整URL 的方放,icech做成了函数,直接用吧! private string GetPath() { string strPath = "http: ...
- Env:Winmanager插件使用
转自:http://www.cnblogs.com/feichexia/archive/2012/11/06/vim_WinManager.html 1.准备winmanger插件,从下面网址下即可: ...
- 利用NTFS权限与虚拟目录,在IIS 6.0的默认FTP站点中做用户隔离。
默认FTP站点为不隔离用户站点,利用NTFS权限设置,达到仅能访问指定目录效果. 是否允许匿名连接 FTP站点主目录:站点范围内有没有用户需要上传,有的话,要勾选“写入”:具体用户使用NTFS还给予写 ...
- OAF_架构MVC系列2 - Model的概述(概念)
2014-06-22 Created By BaoXinjian
- XueXX and Chessboard(dp)
题解: 本题是DP,状态转移方程是dp[i][j]=dp[i-1][j]+dp[i][j-1],只不过要加上许多判断,最后即可求出答案,要注意输入从1开始输入,并且dp[0][1]=1,这样才能使dp ...
- phpmyadmin数据库导入出错
SQL 查询: -- phpMyAdmin SQL Dump-- version 3.5.1-- http://www.phpmyadmin.net---- 主机: localhost-- 生成日期: ...
- JAVA if条件语句,switch多分支结构,与逻辑运算符
一.if条件语句 示例: import java.util.Scanner; public class Test{ public static void main(String[] args){ Sc ...
- 如何让div水平居中
代码实例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- Android之SQLite
在模拟器运行的情况下,进入cmd运行adb shell 可进入模拟器的linux系统输入 lite3 mars_test_db 可进入sqlite模式.schema或者.sch 查看有哪些表 SQLi ...
- spring ioc原理(看完后大家可以自己写一个spring)
控制反转/依赖注入 最近,买了本Spring入门书:spring In Action .大致浏览了下感觉还不错.就是入门了点.Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专 ...