Hibernate深入学习(一):实体映射文件中的package,auto-import,dynamic-insert,dynamic-update用法

来源:互联网 发布:p2p运营模式数据图表 编辑:程序博客网 时间:2024/06/05 01:13

相信各位童鞋对Hibernate实体映射文件不会陌生,它往往以".hbm.xml"的形式存放在实体类的同级包目录下。


最近想再仔细学习hibernate,看到映射文件这部分还有很多细节不了解,特此填补一下

1.根元素hibernate-mapping的package属性,该属性表示该映射文件中统一使用package属性值作为包名

<hibernate-mapping package="cn.sina.beans" >
那么我们在写class属性值时,就可以只写类名,不用写类全名了,比如:

<class name="Dog" table="dog">
<one-to-many class="Pants"/>



2.在使用HQL查询时,假如有两个Student类,也都有实体映射文件,那么hibernate怎么区分呢?

首先我们来看看hibernate无法区分时的报错信息:

Caused by: org.hibernate.DuplicateMappingException: duplicate import: Dog refers to both cn.sina.autoImport.Dog andcn.sina.entity.Dog (try using auto-import="false")
此时有两种解决方案
方案一:在使用HQL查询时使用类的全名

session.createQuery("from cn.sina.entity.Dog")


方案二:为类名取个别名。在映射文件中加入:

<hibernate-mapping package="xxx" auto-import="false">  <import class="Dog" rename="doggle"/>  ......  </hibernate-mapping>  

session.createQuery("from doggle") //使用别名进行HQL查询



3.dynamic-insert与dynamic-update

先说说这两个属性的位置,它是<class>中的属性,此时我们使用hibernate插入一条数据

Transaction transaction = session.beginTransaction();Dog dog = new Dog();dog.setName("tom");dog.setBreed("ja");session.save(dog);transaction.commit();
此时我没有设置color字段


如果不设置这两个属性时:<class name="Dog" table="dog" >
hibernate发出的sql为:主要看括号内的字段

 insert into dog (name, color, breed, did)  values (?, ?, ?, ?)

设置之后:<class name="Dog" table="dog" dynamic-insert="true" dynamic-update="true">
此时hibernate发出的sql为:

insert into dog (name, breed, did) values (?, ?, ?)
可以看到是没有color字段的,update同理,这就是这两个属性的作用


4.为字段加索引

这个比较简单,在property元素中加入index属性,属性值就是索引名                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

5.foreign-key的用法:它主要用户给外键约束起一个名字,否则由hibernate自动生成

<many-to-one foreign-key="fk_brand_pants" name="brand" column="brand_id" class="Brand" />
其中foreign-key是外键约束名,column是引用的外键列名,name是实体类中对应的字段名


好了,能想到也就这么多了,以后肯定还会遇到别的知识,到时候会补充

0 0
原创粉丝点击