hibernate的.hbm.xml文件文件配置属性详解
一般.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">
<!-- Generated 2014-9-29 8:46:32 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.jeremy.hibernate.app.News" table="NEWS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="title" type="java.lang.String">
<column name="TITLE" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" />
</property>
<property name="date" type="java.util.Date">
<column name="DATE" />
</property>
</class>
</hibernate-mapping>
<Hibernate-mapping>标签的属性如下:
1)package:指定一个包前缀,如果在映射文档中(就是在class标签的那么属性里没有指定全类名)没有指定全限定的类名,就使用这个作为包名,
2)schema:数据库schema的名称
3)catalog:数据库catalog的名称
4)default-cascade:默认的级联风格,默认为none
5)default-access:Hibernate用来访问属性的策略
6)default-lazy:指定了此属性,未明确注明lazy属性的Java属性和集合类,Hibernate会采取的默认使用这个属性加载风格,默认为true
7)auto-import:指定我们是否可以在查询语言中使用非全限定的类名,默认为true,如果项目中有两个同名的持久化类,则最好在这两个类的对应的映射文件中配置为false
Hibernate的子标签class标签:
class 元素用于指定类和表的映射
name:指定该持久化类映射的持久化类的类名
example:<class name="com.jeremy.hibernate.example.News" table="NEWS">
table:指定该持久化类映射的表名, Hibernate 默认以持久化类的类名作为表名
example:<class name="com.jeremy.hibernate.example.News" table="NEWS">
dynamic-insert: 若设置为 true, 表示当(调用Session的save()方法时)保存一个对象时, 会动态生成 insert 语句, insert 语句中仅包含所有取值不为 null 的字段. 默认值为 false
Example:这个跟dynamic-update一个意思
dynamic-update: 若设置为 true, 表示当(调用对象的set()方法)更新一个对象时, 会动态生成 update 语句, update 语句中仅包含所有取值需要更新的字段. 默认值为 false
Example:当我们调用对象的set()方法时,Hibernate会自动帮我们发送更新语句给数据库是吧,但是有没有注意到发送给数据库语句有什么不同呢?下面看一下
@Test
public void TestDymainUpdate(){
News news=(News) session.get(News.class, 1);
news.setAuthor("jeremyJeremy");
}
这个是我测试的代码,当我运行这代码时控制台出现了下面的代码:
Hibernate:
select
news0_.ID as ID1_0_0_,
news0_.TITLE as TITLE2_0_0_,
news0_.AUTHOR as AUTHOR3_0_0_,
news0_.DATE as DATE4_0_0_
from
NEWS news0_
where
news0_.ID=?
Hibernate:
update
NEWS
set
TITLE=?,
AUTHOR=?,
DATE=?
where
ID=?
select部分是我调用的Session的get()方法,Hibernate自动发送的,
update部分是我调用了对象的set()方法触发的是吧,但是有没有注意到,我的测试代码里只更新一个Author属性吖,Hibernate为啥会帮我把其它属性也更新吖,虽然数据没变,但是是不是有点低效率吖,我只想我更新那个属性,Hibernate就帮我更新那个属性,所以这里就要用到class标签的dynamic-update属性了:当我把这属性值改为TRUE后:
Hibernate自动发送的语句:
Hibernate:
update
NEWS
set
AUTHOR=?
where
ID=?
select-before-update:设置 Hibernate 在更新某个持久化对象之前是否需要先执行一次查询. 默认值为 false
这个有在我一篇文章详细介绍:http://www.cnblogs.com/jeremy-blog/p/4000419.html
batch-size:指定根据 OID 来抓取实例时每批抓取的实例数.
lazy: 指定是否使用延迟加载.
mutable: 若设置为 true, 等价于所有的 <property> 元素的 update 属性为 false, 表示整个实例不能被更新. 默认为 true.
discriminator-value: 指定区分不同子类的值. 当使用 <subclass/> 元素来定义持久化类的继承关系时需要使用该属性(不建议使用)
class标签的子标签
<id>标签:在对象-关系映射文件中, <id> 元素用来设置对象标识符. <generator> 子元素用来设定标识符生成器.
<id name="id" type="java.lang.Integer">---指定类中的ID属性和类型
<column name="ID" />-----数据库中列名
<generator class="native" />-----指定ID的自动生成方式,(例如自增,或者随机生成)
</id>
generator的class属性:
详细解析:
increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
Hibernate 会先读取 NEWS 表中的主键的最大值, 而接下来向 NEWS 表中插入记录时, 就在 max(id) 的基础上递增, 增量为 1.
适用范围: 由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
适用于只有单个 Hibernate 应用进程访问同一个数据库的场合, 在集群环境下不推荐使用它 OID 必须为 long, int 或 short 类 型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
模拟increment生成器产生问题的过程:
@Test
public void testIncrement() throws InterruptedException{
News news1=new News("AA","AAAAA",new Date()); session.save(news1); Thread.sleep(5000); }
把上面的代码连续运行两次就相当于有连续两次的客户访问我的数据库,就是说同时多人访问我数据库时,大家读取到的max值都是一样的吧,所以插入的时候ID值会并发出主键重复的问题,所以在实际开发中不能应用这种方式来生成ID
还有很多主键生成器,我忽略一下,因为实在太多了
下面介绍一下class标签的子标签property
<property>:元素用于指定类的属性和表的字段的映射(关联起来)
属性:
name:指定该持久化类的属性的名字
column:指定与类的属性映射的表的字段名. 如果没有设置该属性, Hibernate 将直接使用类的属性名作为字段名.
type:指定 Hibernate 映射类型. Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁.
如果没有为某个属性显式设定映射类型,Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类 型.(例如Java.lang.String->String->varchar)
update:设置该列是否可以被修改,默认是TRUE,设置为FALSE时不可以修改列的值,
not-null:若该属性值为 true, 表明不允许为 null, 默认为 false
access:指定 Hibernate 的默认的属性访问策略。
默认值为 property, 即使用 getter, setter 方法来访问属性.
若指定 field, 则 Hibernate 会忽略 getter/setter 方法, 而通过反射访问成员变量
unique: 设置是否为该属性所映射的数据列添加唯一约束.
index: 指定一个字符串的索引名称.当系统需要 Hibernate 自动建表时, 用于为该属性所映射的数据列创建索引, 从而加快该数据列的查询
length: 指定该属性所映射数据列的字段的长度
scale: 指定该属性所映射数据列的小数位数, 对 double, float, decimal 等类型的数据列有效.
formula:设置一个 SQL 表达式,Hibernate 将根据它来计算出派生属性的值.派生属性:并不是持久化类的所有属性都直接和表的字段匹配,
持久化类的有些属性的值必须在运行时通过计算才能得出来, 这种属性称为派生属性
Example:例如下面的的desc列是有author列+“:”+title列组成的,那咋们可以这样配置formula
<!-- 映射派生属性 -->
<property name="desc" formula="(SELECT concat(author, ': ', title) FROM NEWS n WHERE n.id = id)"></property>
表间(对象和对象之间)映射关系配置说明
配置步骤:
①:分析1端和n端
②:在1端插入n端的集合属性
③:在n端插入一端的对象属性
④:注明关系在那一段维护
单向一对一:
one-to-one:one-to-one<--->many-to-one
example:IDCard<-->person
①IDCard是一端,Person也是1端
②在IDCard一端插入另一个一端的对象属性:--->private person person
③在person一端插入另一个一端的对象属性:--->private IDCard IDCard
④指定维护关系:在维护方指定被维护方的外键--<many-to-one name="idCard" unique="true"></many-to-one>
单向一对多:
one-to-many<--->many-to-one
many-to-many<-->many-to-many>
hibernate的.hbm.xml文件文件配置属性详解的更多相关文章
- Linux文件权限与属性详解 之 su & sudo
Linux文件权限与属性详解 之 一般权限 Linux文件权限与属性详解 之 ACL Linux文件权限与属性详解 之 SUID.SGID & SBIT Linux文件权限与属性详解 之 ch ...
- 轻松学习Linux之Shell文件和目录属性详解
轻松学习Linux之Shell文件和目录属性详解 轻松学习Linux之理解Sitcky 轻松学习Linux之理解umask 轻松学习Linux之理解SUID&SGUID 本系列多媒体教程已完成 ...
- Linux文件权限与属性详解 之 SUID、SGID & SBIT
Linux文件权限与属性详解 之 一般权限 Linux文件权限与属性详解 之 ACL Linux文件权限与属性详解 之 SUID.SGID & SBIT Linux文件权限与属性详解 之 ch ...
- Linux文件权限与属性详解 之 一般权限
目录 一般属性 1. iNode: 3152621 2. 文件类型 3.文件访问权限 4. 链接数目: 5. 文件所有者 6. 文件所属组 7. 文件大小 8. 修改时间 9. 文件名称 Linux文 ...
- Linux文件权限与属性详解 之 ACL
Linux文件权限与属性详解 之 一般权限 Linux文件权限与属性详解 之 ACL Linux文件权限与属性详解 之 SUID.SGID & SBIT Linux文件权限与属性详解 之 ch ...
- Linux文件权限与属性详解 之 chattr & lsattr
Linux文件权限与属性详解 之 一般权限 Linux文件权限与属性详解 之 ACL Linux文件权限与属性详解 之 SUID.SGID & SBIT Linux文件权限与属性详解 之 ch ...
- Hibernate 中配置属性详解(hibernate.properties)
Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数.多数配置参数都 有比较直观的默认值, 并有随 Hibernate一同分发的配置样例hibernate.properties ...
- Android XML文件布局各个属性详解
第一常用类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android: ...
- Linux文件权限与属性详解 之 SUID、SGID&SBIT
一.SetUID 1.Linux普通用户可以修改自己的密码,这个是一个合情合理的设置; 修改密码其实修改的是/etc/shadow这个文件,这个文件的属性: ----------. 1 root ro ...
随机推荐
- SpringCloud-服务注册与发现
这里我们会用到Spring Cloud Netflix,该项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的N ...
- Nginx配置优化详解
如果你已经安装过Nginx并在生产环境中使用,那么Nginx配置优化你一定也要做,这样才能看到Nginx性能,本文就从基本配置优化开始到高层配置教你如何优化Nginx 大多数的Nginx安装指南告诉你 ...
- java工程资源文件夹嵌套建立!
做过一遍忘了,找了半天!记这里,看你还忘不忘!
- Python黑魔法,一行实现并行化
Python 在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题.常见的经典 Python 多线程.多进程教程多显得偏“重”.而且往往隔靴搔 ...
- Ruby入门笔记
Ruby入门笔记 一切皆为对象 “Hello”.length 方法 定义:def开头 end结尾 命名一般采用下划线分隔单词
- 三、请求库之requests模块
一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网 ...
- oracle 使用occi方式 批量插入多条数据
if (vecInfo.empty()) { ; //数据为空,不上传,不上传标志设置为1,只有0表示上传成功 } std::string strUserName = userName; std::s ...
- 基于jQuery select下拉框美化插件
分享一款基于jQuery select下拉框美化插件.该插件适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览 源码下 ...
- cocos2dx场景切换的坑
有一个类可以使用不同的数据源,每个数据源对应一个对象. 我在类里保存了对象的实例,由于要在其它地方使用所以做成了静态,并在每次初始化时 重新设置,析构时删除. 现在我打开了A,切换到B,结果这个静态的 ...
- [uboot]MLO和uboot-spl.bin, uboot.img和uboot.bin
前段时间使用TI的am4378芯片,发现系统在SD卡启动的时候,启动文件使用的是MLO和uboot.img:而Norflash和eMMC启动的时候使用的是 uboot-spl.bin和uboot.bi ...