Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27
前言:
之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题,比如日志输出、slf4j对应的版本等等。其实官方网站下载的hibernate和Spring也是不可靠的,因为这些报的运行也需要其他的包的支持。所以及时自己在IED编辑的时候,没有出现“红线”不一定代表就会正确的编译运行。如果程序运行的时候缺少包的话,一定要养成习惯去对应的官方网站下载,有时候对应的版本也十分重要。
这一节继续深入的学习Hibernate的配置文件和ORM映射文件
1.Hibernate配置文件
对于配置文件的方式:hibernate.properties方式、hibernate.cfg.xml方式和两者结合使用。
常用的配置属性:
hibernate.dialect: 针对不同的数据库提供不同的方言类,允许hibernate针对特定的数据库生成优化的SQL语句。
hibernate.connection.driver_class:
hibernate.connection.url
hibernate.connection.username
hibernate.connection.password
hibernate.connection.pool_size
hibernate.connection.datasource//数据源的JNDI名字
hibernate.show_sql:是否输出Hibernate操作数据库的时候执行的sql
hibernate.format_sql:是否格式化的输出sql语句
hibernate.hbm2ddl.auto: 自顶向下,从持久化类导数据库的操作,有几个选择的值:create(每一次都会重新生成表),create-drop(创建之后,当sessionFactory关闭的时候,就会自动删除),update,validate(只是比较,不会创建表)
需要解释的是hibernate.dialect:
不同的数据库对应不同的方言类:
DB2 org.hibernate.dialect.DB2Dialect
SQL server org.hibernate.dialect.SQLServerDialect
MySQL org.hibernate.dialect.MySQLDialect
Oracle9i org.hibernate.dialect.Oracle9iDialect
Sybase org.hibernate.dialect.SybaseDialect
对于使用properties方式配置的,这里是没有ORM Mapper的配置信息,所以需要使用configuration.addResource(“com.yang.model.mapper…”)一个一个的加载,其中hibernate.properties配置文件必须在根目录下面。
当然两者是可以联合使用的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test??useUnicode=true&characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">221256</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
<property name="hibernate.format_sql">true</property>
-->
<!-- 注册所有的ORM映射文件 -->
<mapping resource="com/yang/model/mapper/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.Hibernate映射文件
映射文件的根元素是<hibernate-mapping>该元素之下,可以有很多class元素,每一个class元素对应一个持久化类的映射。
映射文件的结构如下:
<hiberbate-mapping 属性=”值”>
<class name=”PackageName.ClassName” table=”tableName”>
<id name=”主键名” column=”主键列”>
<generator class=”生成策略”/>
</id>
<!—属性列表-->
<property name=”userName” column=”columnName” type=”数据类型”/>
</class>
</hibernate-mapping>
其中<hibernate-mapping>元素的可选属性如下:
schema: 指定映射数据库的schema名
catalog:指定数据库的Catalog名字
default-cascade: 设置hibernate的默认级联风格,默认是none
default-access:设置默认属性的访问策略,默认是property
default-lazy:设置默认的延迟加载策略,默认是true
auto-import:是否允许使用非全限定的类名,默认是ture
package:指定一个包,对于映射文件中非全限定的类名,默认在该包下
而class的元素常见的属性有:
name: 持久化类名
table:持久化类映射表名
discriminator-value:区分不同子类的值
mutable:指定的持久化了的实例是否可变,默认是true
proxy:延迟装载的代理,可以是该类自己的名字
主键生成器
Hibernate映射文件中的<id>元素定义了持久化类的标识符属性(主键),其generator子元素则用来设置当前持久化类的标识符属性的生成策略。在hibernate中内置了很多的主键生成器
increment: 获取数据库中的主键最大值,然后加1
identity:自动增长。 MySQL SQL Server 等可以设置表的都一个字段是自动增长的,此种方式生成主键的数据类型可以是long short int和对应的封装类的类型
sequence:序列,数据库中如Oracle DB2中可以创建一个序列,然后从序列中获取当前序列号作为主键值。
还有hilo, seqhilo, uuid, guid, native, assigned, foreign等等多种方法。在MYSQL中推荐使用identity或者是native。如果使用分布式部署数据库的话,推荐使用uuid,也就是采用128位的UUID算法生成一个字符穿类型的主键。
<?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">
<hibernate-mapping>
<class name="com.yang.model.User" table="user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="userName" column="username" type="string" not-null="true"/>
<property name="password" column="password" type="string" not-null="true"/>
</class>
</hibernate-mapping>
3.持久化对象
Hibernate持久化对象的几个状态:
瞬时状态:对象使用new关键字创建,尚未与Hibernate的Session关联,此时的对象处于瞬时状态(Transient)瞬时状态的对象时不会保存到数据库的,也不会赋予持久化标注,如果程序中失去了瞬时状态对象的引用,那么他也会被垃圾回收机制回收
持久化状态(Persistent):它和数据库表中的一条记录相对应,并且有一个持久化的标识。持久化对象时可以刚刚爆保存的或者是刚被加载的。持久化状态的对象必须和指定的Session关联,他的改动Hibernate都会检测到,并且在Session关闭或者Transaction提交的同时更新数据库中对应的数据,开发者不需要手动执行UPDATE
托管状态(Detached):曾经处于持久化状态,与之关联的Session被关闭,对象就会被托管了。
改变持久化对象的方法:使用Session中的接口方法对持久化对象状态产生的影响:
save():保存持久化对象,在数据库中新增加一条数据
saveOrUpdate()保存或者是更新,该方法根据id标签的unsaved-value属性值决定执行新增加一条记录或者是更新。
get()根据标识符属性获得一个持久化对象,如果未找到,则返回null
load()该方法根据标识符属性加在一个持久化对象,如果未找到,则抛出异常
update() 该方法对托管状态的对象重新完成持久化,更新数据库中的数据
delete()删除数据库中的一条记录,不过需要先使用get() or load() 获取持久化对象
close()关闭当前的session对象,并且清空该对象中的数据
evict()用于清除session缓存中的某一个对象
clear()清除Session中的所有缓存对象。
YangTengfei
2013.11.28
Hibernate入门3.配置映射文件深入的更多相关文章
- Hibernate课程 初探多对多映射2-3 配置映射文件
本节主要内容:配置映射文件 Project.hbm.xml <hibernate-mapping> <class name="com.ddwei.entity.Projec ...
- hibernate hbm.xml配置映射
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Eclipse从数据库逆向生成Hibernate实体类和映射文件(Eclipse插件系列之HibernateTools)
♣下载安装Eclipse插件(HibernateTools) ♣Eclipse连接数据库(Mysql5.7) ♣新建hibernate.properties和hibernate.cfg.xml文件 ♣ ...
- 三 MyBatis配置文件SqlMapCofing.xml(属性加载&类型别名配置&映射文件加载)
SqlMapCofing:dtd,属性加载有固定的顺序Content Model properties:加载属性文件 typeAliases:别名配置 1 定义单个别名:不区分大小写 核心配置: 映射 ...
- Hibernate 5 入门指南-基于映射文件
由于Hibernate 4版本混乱,Hibernate 3有些过时,Hibernate 5的开发文档尚不完善,所以构建一份简单的Hibernate 5的入门指南 注:案例参考Hibernate 官方参 ...
- 概述hibernate入门安装配置
1.jdbc连接的优缺点 JDBC的优点 直接底层操作,提供了很简单.便捷的访问数据库的方法,跨平台性比较强.灵活性比较强,可以写很复杂的SQL语句. JDBC的缺点 1).因为JAVA是面向对象的, ...
- 反向生成hibernate实体类和映射文件
工欲善其事,必先利其器.我们可以使用IDE来根据数据库中的表反向生成实体类和映射文件,虽然这些东西手写也并不是难度很大,但是如果存在大量的简单工作需要我们做,也会显得很麻烦. 写在前面 我们反向生成的 ...
- hibernate用注解替代映射文件
1.首先把原来的映射文件删掉,给实体类添加注解: @Entity //声明当前类为hibernate映射到数据库中的实体类 @Table(name="news") //声明tabl ...
- hibernate课程 初探一对多映射2-5 创建持久化类并配置映射文件
学习点: 1 一对多映射,一方 Grade.hbm.xml的写法: <hibernate-mapping> <class name="com.ddwei.entity.Gr ...
随机推荐
- JS中的this对象详解
JS中this关键字很常见,但是它似乎变幻莫测,让人抓狂.这篇文章就来揭示其中的奥秘. 借助阮一峰老师的话:它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.这句话看似平常,可是要非常注意 ...
- 深入理解JVM内存模型
1.程序计数器在虚拟机的概念模型里字节码解释器工作时就是通过改变 这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. Java 虚拟机的多线程是通过线程轮流切换并分配处理器执 ...
- 如何断开所有SQL Server所有的连接
方法1: 执行以下脚本 01.declare @sql varchar(100) 02. 03.while 1=1 04.begin 05. 06.select top 1 ...
- js 图片预览
图片预览 $('#pac_recipe').change(function() { var imgsrc = ''; ]) { //chrome firefox imgsrc = window.URL ...
- 多线程JAVA篇(一)
解析AsyncTask源码之前,首先讲述与之相关的Java线程知识: 知识点清单 1.Thread类 2.Runnable接口 3.Callable接口 4.synchronized关键字 5.vol ...
- HDU 1885 Key Task (BFS + 状态压缩)
题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...
- lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了
lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了 解决:将主上的keepalived重启,故障解除 原因:不可知 lvs常见故障原因: real server上的脚步没 ...
- 「2013-9-5」Configure WingIDE for better display of East Asian Glyphs
很久没写软件配置相关的博客了.这次对于 WingIDE 在 Windows 下的字体配置,折腾了好一阵子,略曲折,也反映了「不清楚原理和背景的情况下,盲人摸象的效率低下是必然」这条放之四海而皆准的赤果 ...
- Codeforces #259 Div.2
A. Little Pony and Crystal Mine 模拟题. 用矩阵直接构造或者直接根据关系输出 B. Little Pony and Sort by Shift 模拟题. 通过提供的操作 ...
- 导入DXF文件
1.选择菜单“File-Import-DXF”. 2.设置DXF文件参数.DXF file:选择DXF结构文件,单位,要和DXF源文件的单位一致.在DXF file中选择文件后,下方的Layer co ...