Java Hibernate中的持久化類和實(shí)體類關(guān)系
Hibernate是一個(gè)開源的ORM(對(duì)象關(guān)系映射)框架,用于將Java程序中的對(duì)象映射到數(shù)據(jù)庫(kù)中的關(guān)系型數(shù)據(jù)。在Hibernate中,持久化類是用來映射Java對(duì)象和關(guān)系型數(shù)據(jù)庫(kù)表的類。
編寫Hibernate持久化類需要遵循以下規(guī)則:
- 持久化類必須有一個(gè)無參構(gòu)造函數(shù),否則Hibernate無法創(chuàng)建對(duì)象。
- 持久化類必須映射到數(shù)據(jù)庫(kù)中的表,可以使用@Table注解指定表名。
- 持久化類的屬性必須與數(shù)據(jù)庫(kù)表的列一一對(duì)應(yīng),可以使用@Column注解指定列名。
- 持久化類必須有一個(gè)唯一標(biāo)識(shí)符,可以使用@Id注解指定。
- 持久化類的屬性可以使用@Basic注解指定是否為基本類型,如字符串、數(shù)字等。
- 持久化類的屬性可以使用@Transient注解指定不需要持久化到數(shù)據(jù)庫(kù)中。
在Hibernate中,主鍵生成策略有多種,常見的有自增、UUID、序列等??梢允褂聾GeneratedValue注解指定主鍵生成策略,例如:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
其中@GeneratedValue注解中的strategy屬性指定主鍵生成策略的方式,IDENTITY表示使用自增方式生成主鍵。
除了使用注解指定主鍵生成策略外,還可以使用XML文件配置主鍵生成策略,例如:
<id name="id" type="java.lang.Long"> <column name="id" /> <generator class="identity" /> </id>
其中標(biāo)簽中的class屬性指定主鍵生成策略的方式,identity表示使用自增方式生成主鍵。
Hibernate的持久化類的三種狀態(tài)
在Hibernate中,持久化類有三種狀態(tài):瞬時(shí)狀態(tài)、持久狀態(tài)和游離狀態(tài)。
- 瞬時(shí)狀態(tài):持久化類對(duì)象沒有與Session關(guān)聯(lián),也沒有被保存到數(shù)據(jù)庫(kù)中,此時(shí)修改對(duì)象的屬性不會(huì)被保存到數(shù)據(jù)庫(kù)。
- 持久狀態(tài):持久化類對(duì)象已經(jīng)被保存到數(shù)據(jù)庫(kù)中,并與Session關(guān)聯(lián),此時(shí)修改對(duì)象的屬性會(huì)被保存到數(shù)據(jù)庫(kù)。
- 游離狀態(tài):持久化類對(duì)象已經(jīng)被保存到數(shù)據(jù)庫(kù)中,但是與Session已經(jīng)脫離關(guān)系,此時(shí)修改對(duì)象的屬性不會(huì)被保存到數(shù)據(jù)庫(kù)。
可以使用Session的save、persist、update、merge方法來將持久化類對(duì)象從瞬時(shí)狀態(tài)轉(zhuǎn)換為持久狀態(tài)或游離狀態(tài)。
save方法用于將瞬時(shí)狀態(tài)的對(duì)象保存到數(shù)據(jù)庫(kù)中,并返回持久狀態(tài)的對(duì)象。如果對(duì)象已經(jīng)是持久狀態(tài),則不執(zhí)行任何操作。
persist方法用于將瞬時(shí)狀態(tài)的對(duì)象保存到數(shù)據(jù)庫(kù)中,不返回持久狀態(tài)的對(duì)象。如果對(duì)象已經(jīng)是持久狀態(tài),則不執(zhí)行任何操作。
update方法用于將游離狀態(tài)的對(duì)象更新到數(shù)據(jù)庫(kù)中,并返回持久狀態(tài)的對(duì)象。如果對(duì)象是瞬時(shí)狀態(tài),則拋出異常。
merge方法用于將游離狀態(tài)的對(duì)象合并到Session中,并返回持久狀態(tài)的對(duì)象。如果對(duì)象是瞬時(shí)狀態(tài),則將對(duì)象保存到數(shù)據(jù)庫(kù)中并返回持久狀態(tài)的對(duì)象。
Hibernate的一級(jí)緩存
Hibernate的一級(jí)緩存是Session級(jí)別的緩存,用于緩存持久化類對(duì)象。當(dāng)從數(shù)據(jù)庫(kù)中查詢持久化類對(duì)象時(shí),Hibernate會(huì)先從一級(jí)緩存中查找,如果緩存中不存在,則從數(shù)據(jù)庫(kù)中查詢,并將查詢結(jié)果放入一級(jí)緩存中。
一級(jí)緩存的生命周期與Session相同,當(dāng)Session關(guān)閉時(shí),一級(jí)緩存也會(huì)被清空。可以使用Session的evict、clear方法來清空一級(jí)緩存。
evict方法用于將指定的對(duì)象從一級(jí)緩存中移除,使得對(duì)象變成游離狀態(tài)。
clear方法用于清空一級(jí)緩存中的所有對(duì)象,將所有持久狀態(tài)的對(duì)象變成游離狀態(tài)。
Hibernate的事務(wù)管理
在Hibernate中,事務(wù)用于保證對(duì)數(shù)據(jù)庫(kù)的操作具有原子性、一致性、隔離性和持久性??梢允褂肨ransaction接口來管理事務(wù),例如:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); try { // 執(zhí)行數(shù)據(jù)庫(kù)操作 tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); }
在事務(wù)中,可以使用Session的save、persist、update、merge、delete等方法來操作持久化類對(duì)象,并在事務(wù)提交時(shí)將操作結(jié)果保存到數(shù)據(jù)庫(kù)中。
Hibernate的其他API
除了以上介紹的API外,Hibernate還提供了許多其他的API,例如:
- Criteria API:用于動(dòng)態(tài)查詢持久化類對(duì)象。
- HQL(Hibernate Query Language):一種基于SQL的查詢語(yǔ)言,用于查詢持久化類對(duì)象。
- Named Query:將HQL查詢語(yǔ)句保存在持久化類中,方便重復(fù)使用。
- Second-level Cache:用于緩存持久化類對(duì)象,提高查詢效率。
以上是Hibernate的持久化類編寫規(guī)則、主鍵生成策略、持久化類狀態(tài)、一級(jí)緩存、事務(wù)管理和其他API等內(nèi)容的介紹。希望本文能夠幫助讀者更好地理解Hibernate框架的使用。
Hibernate的實(shí)體類關(guān)系映射
在Hibernate中,實(shí)體類之間的關(guān)系可以通過注解、XML配置文件或者Java代碼來進(jìn)行映射。常用的關(guān)系有一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多。
一對(duì)一關(guān)系
一對(duì)一關(guān)系表示兩個(gè)實(shí)體類之間的關(guān)系是一對(duì)一的關(guān)系。在Hibernate中,可以使用@OneToOne注解來進(jìn)行映射。
例如,一個(gè)Person實(shí)體類和一個(gè)IDCard實(shí)體類之間的關(guān)系是一對(duì)一的關(guān)系,可以使用如下的代碼進(jìn)行映射:
@Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToOne(mappedBy = "person", cascade = CascadeType.ALL) private IDCard idCard; // getters and setters } @Entity public class IDCard { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String number; @OneToOne @JoinColumn(name = "person_id") private Person person; // getters and setters }
其中,Person實(shí)體類中使用了@OneToOne注解來映射與IDCard實(shí)體類的關(guān)系,屬性mappedBy指定了IDCard實(shí)體類中的person屬性與Person實(shí)體類中的idCard屬性之間的關(guān)系,cascade屬性指定了級(jí)聯(lián)操作。
IDCard實(shí)體類中使用了@OneToOne注解來映射與Person實(shí)體類的關(guān)系,屬性JoinColumn指定了Person實(shí)體類中與IDCard實(shí)體類關(guān)聯(lián)的外鍵列名。
一對(duì)多關(guān)系
一對(duì)多關(guān)系表示一個(gè)實(shí)體類可以對(duì)應(yīng)多個(gè)另一個(gè)實(shí)體類的對(duì)象。在Hibernate中,可以使用@OneToMany注解來進(jìn)行映射。
例如,一個(gè)Department實(shí)體類中有多個(gè)Employee實(shí)體類的對(duì)象,可以使用如下的代碼進(jìn)行映射:
@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "department", cascade = CascadeType.ALL) private List<Employee> employees; // getters and setters } @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id") private Department department; // getters and setters }
其中,Department實(shí)體類中使用了@OneToMany注解來映射與Employee實(shí)體類的關(guān)系,屬性mappedBy指定了Employee實(shí)體類中的department屬性與Department實(shí)體類中的employees屬性之間的關(guān)系,cascade屬性指定了級(jí)聯(lián)操作。
Employee實(shí)體類中使用了@ManyToOne和@JoinColumn注解來映射與Department實(shí)體類的關(guān)系,屬性JoinColumn指定了Department實(shí)體類中與Employee實(shí)體類關(guān)聯(lián)的外鍵列名。
多對(duì)一關(guān)系
多對(duì)一關(guān)系表示多個(gè)實(shí)體類可以對(duì)應(yīng)一個(gè)另一個(gè)實(shí)體類的對(duì)象。在Hibernate中,可以使用@ManyToOne注解來進(jìn)行映射。
例如,一個(gè)Employee實(shí)體類所屬于一個(gè)Department實(shí)體類,可以使用如下的代碼進(jìn)行映射:
@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters and setters } @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id") private Department department; // getters and setters }
其中,Employee實(shí)體類中使用了@ManyToOne和@JoinColumn注解來映射與Department實(shí)體類的關(guān)系,屬性JoinColumn指定了Department實(shí)體類中與Employee實(shí)體類關(guān)聯(lián)的外鍵列名。
多對(duì)多關(guān)系
多對(duì)多關(guān)系表示多個(gè)實(shí)體類之間互相關(guān)聯(lián)。在Hibernate中,可以使用@ManyToMany注解來進(jìn)行映射。
例如,一個(gè)Student實(shí)體類可以選擇多個(gè)Course實(shí)體類,一個(gè)Course實(shí)體類也可以有多個(gè)Student實(shí)體類,可以使用如下的代碼進(jìn)行映射:
@Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany(mappedBy = "students", cascade = CascadeType.ALL) private List<Course> courses; // getters and setters } @Entity public class Course { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany @JoinTable( name = "course_student", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "student_id") ) private List<Student> students; // getters and setters }
其中,Student實(shí)體類中使用了@ManyToMany注解來映射與Course實(shí)體類的關(guān)系,屬性mappedBy指定了Course實(shí)體類中的students屬性與Student實(shí)體類中的courses屬性之間的關(guān)系,cascade屬性指定了級(jí)聯(lián)操作。
Course實(shí)體類中使用了@ManyToMany和@JoinTable注解來映射與Student實(shí)體類的關(guān)系,屬性JoinTable指定了關(guān)聯(lián)表的名稱和兩個(gè)實(shí)體類之間的關(guān)聯(lián)關(guān)系。
以上是Hibernate的實(shí)體類關(guān)系映射的相關(guān)介紹,希望本文能夠幫助讀者更好地掌握Hibernate框架的使用。
到此這篇關(guān)于Java Hibernate中的持久化類和實(shí)體類關(guān)系的文章就介紹到這了,更多相關(guān)Java Hibernate持久化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 簡(jiǎn)介Java的Hibernate框架中的Session和持久化類
- 解析Java的Hibernate框架中的持久化類和映射文件
- Java?Hibernate中一對(duì)多和多對(duì)多關(guān)系的映射方式
- Java Hibernate使用方法及整合查詢
- Java?hibernate延遲加載get和load的區(qū)別
- Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
- Hibernate傳入Java對(duì)象創(chuàng)建動(dòng)態(tài)表并錄入數(shù)據(jù)
- Java web Hibernate如何與數(shù)據(jù)庫(kù)鏈接
- 詳解Java中Hibernate的基本原理
相關(guān)文章
Spring?boot?CommandLineRunner啟動(dòng)任務(wù)傳參實(shí)例詳解
在使用SpringBoot構(gòu)建項(xiàng)目時(shí),我們通常有一些預(yù)先數(shù)據(jù)的加載,下面這篇文章主要給大家介紹了關(guān)于Spring?boot?CommandLineRunner啟動(dòng)任務(wù)傳參的相關(guān)資料,需要的朋友可以參考下2022-06-06java.lang.NoClassDefFoundError錯(cuò)誤解決辦法
這篇文章主要介紹了java.lang.NoClassDefFoundError錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06java在cmd運(yùn)行"-d"和"-cp"參數(shù)解讀
這篇文章主要介紹了java在cmd運(yùn)行"-d"和"-cp"參數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Mabatis錯(cuò)誤提示Parameter index out of range的處理方法
這篇文章主要介紹了Mabatis錯(cuò)誤提示Parameter index out of range 的處理方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08一文帶你認(rèn)識(shí)Java中的Object類和深淺拷貝
任何變成語(yǔ)言中,其實(shí)都有淺拷貝和深拷貝的概念,Java 中也不例外,下面這篇文章主要給大家介紹了關(guān)于Java中Object類和深淺拷貝的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別
下面小編就為大家?guī)硪黄獪\談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08