Hibernate使用hbm.xml配置映射關(guān)系解析
在使用hibernate時,經(jīng)常需要配置與類對應(yīng)的hbm.xml文件,并在其中指明數(shù)據(jù)庫表的具體細(xì)節(jié)。
由于映射關(guān)系的配置比較繁瑣,故總結(jié)了模板代碼如下:
多對一:
<many-to-one name="本類中的屬性名" class="對方類" column="本類中的屬性名+Id"></many-to-one>
一對多:
<set name="本類中的屬性名"> <key column="多的那一方中引用我主鍵的那個外鍵的名字"></key> <one-to-many class="對方類"></one-to-many> </set>
多對多:
<set name="本類中的屬性名" table="中間表名"> <key column="對方引用我主鍵的那個外鍵的名字"></key> <many-to-many class="對方類" column="對方類+Id"></many-to-many> </set>
基于外鍵的一對一(有外鍵方):
<many-to-one name="本類中的屬性名" class="對方類" column="本類中的屬性名+Id" unique="true"></many-to-one>
基于外鍵的一對一(無外鍵方):
<one-to-one name="本類中的屬性名" class="對方類" property-ref="對方表中對應(yīng)的‘本類中的屬性名'"></one-to-one>
此后,在配置映射關(guān)系時,只需復(fù)制粘貼,再替換提示信息即可,方便使用。
另外,我們還需要繼續(xù)介紹的是:
配置實體類與數(shù)據(jù)庫的映射關(guān)系,有兩種方式:
1.使用*.hbm.xml
2.使用@注解
二:xml的配置方式:
eg:員工的xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
<hibernate-mapping>
<class name="edu.hue.erp.auth.emp.vo.EmpModel" table="tbl_emp">
<!-- id為主鍵的配置:
id-name:實體類中的屬性名
column-name:數(shù)據(jù)庫表中主鍵名
generator-class:主鍵生成策略 -->
<id name="uuid" >
<!-- 數(shù)據(jù)庫表中主鍵字段名與實體類的屬性名相同時,column可以省略不寫 -->
<!-- <column name="uuid"></column> -->
<generator class="native"></generator>
</id>
<!-- property:非主鍵屬性的配置
property-name:實體類中屬性名
column-name:實體類中屬性對應(yīng)的數(shù)據(jù)庫表中字段名
-->
<!-- 數(shù)據(jù)庫表中主鍵字段名與實體類的屬性名相同時,column可以省略不寫 -->
<!-- <property name="username">
<column name="username"/>
</property> -->
<property name="username"/>
<property name="pwd"/>
<property name="name"/>
<property name="tele"/>
<property name="address"/>
<property name="email"/>
<property name="gender"/>
<property name="birthday"/>
<property name="lastLoginTime"/>
<property name="lastLoginIp"/>
<property name="loginTimes"/>
<!-- 員工對部門 多對一的關(guān)系 -->
<!-- name:與員工實體類中含有的部門對象名一致
column:員工表中的外鍵(部門的主鍵)
class:一方 中 類的全路徑 -->
<many-to-one
name="dm"
column="depUuid"
class="edu.hue.erp.auth.dep.vo.DepModel"
/>
<!-- 員工對角色 多對多 -->
<!-- name:與員工實體類中含有的角色對象名一致
table:中間表名
key-column:員工表的主鍵
many-to-many--column:角色主鍵
many-to-many--class:角色類的全路徑 -->
<set name="roles" table="tbl_emp_role">
<key column="empUuid"/>
<many-to-many column="roleUuid" class="edu.hue.erp.auth.role.vo.RoleModel"/>
</set>
</class>
</hibernate-mapping>
<!-- 另外補(bǔ)充在部門的配置文件中:
//部門對員工 一對多
//private Set<Employee> emps;
當(dāng)進(jìn)行級聯(lián)刪除時
一方對象首先要放棄與多方之間的關(guān)系,轉(zhuǎn)化為將外鍵字段設(shè)置為null
如果此時外鍵字段設(shè)置為不允許為null,引發(fā)下列異常
java.sql.BatchUpdateException:Column 'depUuid' cannot be null
此時只需要在進(jìn)行關(guān)系維護(hù)時,使一方對象不對關(guān)系進(jìn)行維護(hù)即可,不操作外鍵——————inverse=true
<set name="emps" cascade="delete" inverse="true">
<key column="depUuid"/>
<one-to-many class="edu.hue.erp.auth.emp.vo.EmpModel"/>
</set>
//注意部門對員工一對多與員工對部門多對一中的column是一致的
-->
總結(jié)
以上就是本文關(guān)于Hibernate使用hbm.xml配置映射關(guān)系解析的全部內(nèi)容,希望對大家有所幫助。歡迎參閱:Java探索之Hibernate主鍵生成策略詳細(xì)介紹、Hibernate實現(xiàn)悲觀鎖和樂觀鎖代碼介紹、hibernate屬性級別注解實例代碼等,如有不足之處,歡迎留言指出!
- Hibernate雙向多對多映射關(guān)系配置代碼實例
- 詳解hibernate雙向多對多關(guān)聯(lián)映射XML與注解版
- Java的Hibernate框架中一對多的單向和雙向關(guān)聯(lián)映射
- Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)
- Hibernate一對多關(guān)聯(lián)雙向關(guān)聯(lián)代碼實現(xiàn)分享
- Hibernate組件映射代碼詳解
- Hibernate映射文件id的generator配置方法
- 快速了解hibernate配置文件與映射文件
- Hibernate雙向一對一映射關(guān)系配置代碼實例
相關(guān)文章
Mybatis-plus批量去重插入ON DUPLICATE key update使用方式
這篇文章主要介紹了Mybatis-plus批量去重插入ON DUPLICATE key update使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
淺析java程序中hibernate的應(yīng)用總結(jié)
hibernate可以理解為是一個中間件它負(fù)責(zé)把java程序的sql語句接收過來發(fā)送到數(shù)據(jù)庫,而數(shù)據(jù)庫返回來的信息hibernate接收之后直接生成一個對象傳給java2013-07-07
Java Socket使用加密協(xié)議進(jìn)行傳輸對象的方法
這篇文章主要介紹了Java Socket使用加密協(xié)議進(jìn)行傳輸對象的方法,結(jié)合實例形式分析了java socket加密協(xié)議相關(guān)接口與類的調(diào)用方法,以及服務(wù)器、客戶端實現(xiàn)技巧,需要的朋友可以參考下2017-06-06
idea打不開雙擊IDEA圖標(biāo)沒反應(yīng)的快速解決方案
這篇文章主要介紹了idea打不開雙擊IDEA圖標(biāo)沒反應(yīng)的快速解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Java使用Math.random()結(jié)合蒙特卡洛方法計算pi值示例
Java 為什么要避免使用finalizer和Cleaner

