Hibernate映射文件 朱雀 2022-07-14 08:48 181阅读 0赞 ## POJO 类和数据库的映射文件\*.hbm.xml ## POJO类和关系数据库之间的映射可以用一个XML文档来定义。 通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系。在运行时 Hibernate 将根据这个映射文件来生成各种SQL语句,映射文件的扩展名为 .hbm.xml。 ## 映射文件说明 ## * hibernate-mapping * 类层次:class \-主键:id \-基本类型:property \-实体引用类: many-to-one | one-to-one \-集合:set | list | map | array one-to-many many-to-many \-子类:subclass | joined-subclass \-其它:component | any 等 * 查询语句:query(用来放置查询语句,便于对数据库查询的统一管理和优化) 下面对各个节点进行介绍 **hibernate-mapping** ![image\_1b346btk31o238fa1j1u1j61n049.png-84.1kB][image_1b346btk31o238fa1j1u1j61n049.png-84.1kB] **class** ![image\_1b346dve91mo81m0d17un1uhvcrpm.png-87.6kB][image_1b346dve91mo81m0d17un1uhvcrpm.png-87.6kB] 在介绍下面的节点之前先来介绍一下**映射对象标识符**: * Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系,对象的OID和数据表的主键对应,Hibernate通过标识符生成器来为主键赋值。 * Hibernate 推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间。 * 在对象-关系映射文件中, <id>元素用来设置对象标识符. <generator>子元素用来设定标识符生成器。 * Hibernate提供了标识符生成器接口:IdentifierGenerator,并提供了各种内置实现。 **id** ![image\_1b346frg8kpu1uui1vcf16961fk313.png-51.2kB][image_1b346frg8kpu1uui1vcf16961fk313.png-51.2kB] **generator** ![image\_1b346ha6bv66hht1vk9bku10fa1g.png-8.4kB][image_1b346ha6bv66hht1vk9bku10fa1g.png-8.4kB] 下面是hibernate提供的内置标识符生成器: ![image\_1b346u22q660j8g1igs1mt81k1n2n.png-63.5kB][image_1b346u22q660j8g1igs1mt81k1n2n.png-63.5kB] * increment 标识符生成器 increment标识符生成器由Hibernate以递增的方式为代理主键赋值,Hibernate会先读取NEWS表中的主键的最大值,而接下来向NEWS表中插入记录时,就在max(id)的基础上递增,增量为 1。 适用范围: 由于increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。 适用于只有单个Hibernate应用进程访问同一个数据库的场合, 在集群环境下不推荐使用它。(并发问题) OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常 。 * identity 标识符生成器 identity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型。 适用范围: 由于identity生成标识符的机制依赖于底层数据库系统,因为要求底层数据库系统必须支持自动正常字段类型,这样的数据库包括:DB2,Mysql,MSSQLServer,Sybase等,不包括oracle。 OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。 * sequence 标识符生成器 sequence标识符生成器利用底层数据库提供的序列来生成标识符。 Hibernate在持久化一个News对象时,先从底层数据库的news\_seq序列中获得一个唯一的标识号,再把它作为主键值 。 适用范围: 由于sequence生成标识符的机制依赖于底层数据库系统的序列,因此, 要求底层数据库系统必须支持序列。支持序列的数据库包括: DB2, Oracle 等,不包括Mysql。 OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。 * hilo 标识符生成器 hilo标识符生成器由Hibernate按照一种“high/low”算法生成标识符。 Hibernate在持久化一个News对象时,由Hibernate负责生成主键值。hilo 标识符生成器在生成标识符时,需要\*\*读取并修改\*\*HI\_TABLE表中的NEXT\_VALUE值。 适用范围: 由于hilo生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。 OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。 * native 标识符生成器 (通常使用的方式) native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity,sequence或hilo标识符生成器。 适用范围: 由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库平台开发。 OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。 **property** ![image\_1b348es521kk81fev41b1q5m38j34.png-205.5kB][image_1b348es521kk81fev41b1q5m38j34.png-205.5kB] ![image\_1b348ggd013651lsckqg1ptc1sa03h.png-130.5kB][image_1b348ggd013651lsckqg1ptc1sa03h.png-130.5kB] * 派生属性: 并不是持久化类的所有属性都直接和表的字段匹配,持久化类的有些属性的值必须在运行时通过计算才能得到,这种属性称为派生属性,下面我们使用property的formular属性来测试派生属性: 首先在News.java中添加一个desc字段: //该属性值为: title:author private String desc; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } 然后在News的映射文件中映射派生属性: <!-- 映射派生属性 --> <property name="desc" formula="(SELECT concat(author, ': ', title) FROM NEWS n WHERE n.id = id)"></property> 测试: @Test public void testFormula(){ News news = (News) session.get(News.class, 1); System.out.println(news.getDesc()); } 运行结果: ![image\_1b34a68661rcq12o4ms3147m1rae3u.png-66.5kB][image_1b34a68661rcq12o4ms3147m1rae3u.png-66.5kB] [image_1b346btk31o238fa1j1u1j61n049.png-84.1kB]: /images/20220714/3c92f00d5d2c43cca15814b003823ec5.png [image_1b346dve91mo81m0d17un1uhvcrpm.png-87.6kB]: /images/20220714/cc62799580b246f4b7c765d1c9b5cc8f.png [image_1b346frg8kpu1uui1vcf16961fk313.png-51.2kB]: /images/20220714/2ed003ccae2e4d4998e2834f9c0a7315.png [image_1b346ha6bv66hht1vk9bku10fa1g.png-8.4kB]: /images/20220714/41c3dceae7bf454d9295d43f5dfb888d.png [image_1b346u22q660j8g1igs1mt81k1n2n.png-63.5kB]: /images/20220714/5287f00aab9d44f5841766abeaa8c7b3.png [image_1b348es521kk81fev41b1q5m38j34.png-205.5kB]: /images/20220714/6f038fe4f8f3456e9e24832afeb95d15.png [image_1b348ggd013651lsckqg1ptc1sa03h.png-130.5kB]: /images/20220714/b3fa9b4dd2f44e47830777731288a513.png [image_1b34a68661rcq12o4ms3147m1rae3u.png-66.5kB]: /images/20220714/84031345edc143ebb82864f66d1ec013.png
还没有评论,来说两句吧...