Hibernate实战(第2版)读书笔记
创始人
2024-04-02 21:32:00
0

最近时间重读hibernate实战(第2版),哈哈,很长时间不用几乎都忘完了。现在作为读书笔记记录下来,以供自己和别人参考。部分例子摘自hibernate实战(第2版)书中。本人能力有限,难免出现错误的地方,欢迎指正。

在hibernate使用seqence的主键生成策略时候,要这样写(下面的写法是针对HSQLDB,不清楚在其他数据库也通用)

Xml代码:

  1.  column="MY_ID">    
  2.   class="sequence">    
  3.    name="sequence">MY_SEQUENCEparam>    
  4.    name="parameters">    
  5.     START WITH 1 INCREMENT BY 1     
  6.   param>    
  7.  generator>    
  8.     
  9.  column="MY_ID"> 
  10.   class="sequence"> 
  11.    name="sequence">MY_SEQUENCEparam> 
  12.    name="parameters"> 
  13.     START WITH 1 INCREMENT BY 1  
  14.   param> 
  15.  generator> 
  16.   

hibernate实战(第2版)书中是这样写的 INCREMENT 1 START WITH 1,这样写插入的call next value for MY_SEQUENCE 返回的是0,START WITH 1 INCREMENT BY 1 执行call next value for MY_SEQUENCE返回的是1,这样奇怪的问题,难道是hsqldb有bug?我也没有去做过多的深究。

Xml代码:

  1.  dynamic-insert="true" dynamic-update="true">   

dynamic-insert 属性告诉hibernate是否在insert语句中包含空的属性值(设置为true,是表明在insert语句中不包含为null的属性,也就是insert语句中包含的属性必须是非空的字段)。

这两个属性在某些地方会有用,比如说在更新中设置dynamic-update=true,如果你仅仅更新了一个属性,没有必要把其他属性的更新也放在sql中,也提高了数据库的执行效率。但是也带来一个副作用,可能就是hibernate要进行比较每个属性的值,来决定是否在sql语句中包含这个字段。当然这对 字段比较多的类是比较有用的。dynamic-insert在做insert操作时候,也是如此。

Xml代码:

  1.  default-access="field">    
  2.  mutable="false">   

标记这个类为不可变类。这样hibernate就可以避免做脏检查。为了保持这个不可变属性,***不写set方法,仅仅保留get方法。设置值通过构造来设置。还要明确指示hibernate访问这个类的字段要通过field来访问,而不是通过get-set方法,这个由 hibernate-mapping的 default-access="field"来设置。

Xml代码:

  1.  auto-import="false">    
  2.   class="mypackage.Class" rename="Hello" />    
  3. hibernate-mapping>   

一般情况下,你写一个类的映射后,hibernate 会自动的导入到HQL的命名空间中。你在HQL查询时候可以仅仅通过类名,而不是包名.类名来使用指定的类了。但是,存在这样一种情况,如果在不同包中有相同的类名,在HQL中就会引起歧义,不过一个很好的办法就是在hibernate-mapping中关闭自动导入的属性,采取显式导入,然后重命名之。这样,你在HQL中就可以直接写 from Hello,而避免了歧义。

Xml代码:

  1.  package="mypackage.model">   

定义package这个属性,可以在这个映射文件中给所有未以包名开头的类名加上定义的包作为前缀。

Xml代码:

  1.  name="description" column="`description`">   

之所以加反引号,是因为你觉得可能description在特定的数据库中是关键字。你加上反引号后,hibernate会为你针对不同的数据库做特定的转化。例如sqlserver,hibernate会为你加上[description],mysql加上`description`,另外在在hsqldb中给description加反引号后,产生的是"description",这样执行起来反而会报错。

Xml代码 :

  1.  name="description" column="desc" access="field">   

指定description字段通过field直接访问。

Xml代码:

  1.  name="total" formula="total + tax_rate * total">   

这个公式在每次查询时候求值,并且这个属性不会被保存和更新,如果你改变其中的数据例如tax_rate,属性值不会去自动计算。

Xml代码:

  1.  name="mydata" update="false" insert="false">   

如果update和i nsert都设置false的话,这个字段就不会出现在INSERT和UPDATE语句中。通常不再类中给不可变的属性添加公有的设置方法。

Xml代码:

  1.  generated="always"   

generated的合法值是always和insert。这个属性通常和dynamic-insert配合起来才更有用。一般用来在属性中插入默认值。

initial_price number(10, 2) default '1'

Xml代码:

  1.  name="initial_price">    
  2.   name="initial_price"   
  3. default="1" generated="insert"/>    
  4. property>   

其中的default属性,只在生成表结构时候有用。hibernate并不会在Java类中,给空的属性设置默认值。

在插入有default属性的字段中,要想使default起作用,必须设置dynamic-insert=true,这样保证有default属性的字段字段不会出现在insert中(default的字段为null),否则,它的值为null(插入NULL而不是默认值),另外默认值插入到数据库之后,因为设置了generated=always,hibernate会在插入后自动的执行一个select,给Java类中的属性设置,如果没有设置generated属性,需要显式调用session.flush()语句。

Xml代码:

  1.  name="Hello">    
  2.   name="Address">    
  3.    name="">    
  4.      
  5. class>   

如果component中说有的属性都为null,那么查询时候,这个组件个引用是null,就是说hello.getAddress()返回的是null,只要有至少一个不为null,那么返回这个组件的引用将不是null。

【编辑推荐】

  1. 初学者适用的Hibernate学习方法
  2. Hibernate优化方法解析
  3. Hibernate一对多关系的处理
  4. Struts与Hibernate的***结合方案
  5. Hibernate的性能优化

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...