hibernate的.hbm.xml文件文件配置属性详解

一般.hbm.xml文件如下面:

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2014-9-29 8:46:32 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="com.jeremy.hibernate.app.News" table="NEWS">
 7         <id name="id" type="java.lang.Integer">
 8             <column name="ID" />
 9             <generator class="native" />
10         </id>
11         <property name="title" type="java.lang.String">
12             <column name="TITLE" />
13         </property>
14         <property name="author" type="java.lang.String">
15             <column name="AUTHOR" />
16         </property>
17         <property name="date" type="java.util.Date">
18             <column name="DATE" />
19         </property>
20     </class>
21 </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>

时间: 2024-10-07 08:45:55

hibernate的.hbm.xml文件文件配置属性详解的相关文章

Hibernate 中配置属性详解(hibernate.properties)

Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数.多数配置参数都 有比较直观的默认值, 并有随 Hibernate一同分发的配置样例hibernate.properties 来展示各种配置选项. 所需做的仅仅是将这个样例文件复制到类路径 (classpath)下并做一些自定义的修改. 属性1.Hibernate JDBC属性 属性名 用途 hibernate.connection.driver_class jdbc驱动类 hibernate.connection.ur

Struts2中Bean配置属性详解

Struts2是一个高度可扩展的框架,框架的大部分核心组件都是以配置的方式写在配置文件里的.当开发 者需要替换其核心组件时只需要提供自己的实现类,并且配置到文件中即可.dakaiStruts2-core-x.x.x.jar 文件,看到该文件中配置了大量的bean定义: ... <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymp

【SSH三大框架】Hibernate基础第十篇:inverse属性详解

inverse经常用在双向的1-N关联之中,也可以用在N-N的关联,这里举例子用双向的1-N关联 还是用部门和员工两个,关于两个的javabean不再写. 首先,我们看下员工的映射文件: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourcef

Maven 项目不打包 *.hbm.xml 映射文件

使用 Maven 部署 Java Web 项目时,Hibernate 的映射文件 *.hbm.xml 没有被打包部署到目标目录下,解决方法:在 pom.xml 文件中 <build> 节点下添加以下代码: 1 <build> 2 …… 3 <resources> 4 <resource> 5 <directory>src/main/java</directory> 6 <includes> 7 <include>

tomcat 三种部署方式以及server.xml文件的几个属性详解

一.直接将web项目文件件拷贝到webapps目录中 这是最常用的方式,Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.如果你想要修改这个默认目录,可以在conf下的server.xml文件里修改Host标签里的appBase值. 这个方法实际上和在IDE开发环境里部署项目是一样的. 用此方法的访问路径为http://localhost:8080/webname 二.修改Server.xml文件 在conf下的server.xml文件里找

Hibernate —— Entity.hbm.xml

一.简述 1.对象关系映射文件,用于映射实体类和关系数据库数据表之间的一个 xml 文件. 2.通过 Entity.hbm.xml 映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据表列之间的对应关系. 3.映射主键.映射关联关系. 二.各个节点 <hibernate-mapping> <class> <id></id> <property name=""></proper

hibernate 关于hbm.xml编写的总结

在Hibernate中,各表的映射文件-.hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具.本节简单的讲述一下这些配置文件的配置. 配置文件的基本结构如下: <?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

jquery的uploadify插件多文件上传配置参数详解

最近做了个多文件上传,需要限制上传文件类型的例子.以前没做过找了一些资料,下次有用.同时也给大家做参考. uploader: uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后淡出打开文件对话框,默认值:uploadify.swf. script: 后台处理程序的相对路径 .默认值:uploadify.php checkScript:用来判断上传选择的文 件在服务器是否存在的后台处理程序的相对路径 fileDataName:设置一个名字,在服务器处理

Linux系统根文件以及命名规则详解

一.Linux系统根文件详解 Linux的重要哲学思想其实就是:将程序的配置文件保存为纯文本格式. 1./boot:系统启动文件,如:内核文件,iniyrd以及gurb(bootloarder) 2./dev:目录下为设备文件,设备文件又分为块设备和字符设备: 块设备:按数据块随机访问,没有顺序. 字符设备:线性访问,按字符为单位进行. 注:其中背景为黑色,字体为***的文件,为特殊文件,"1,   0"分别为文件的主设备号和次设备号 [[email protected] ~]# ls