Java Hibernate中的持久化類和實體類關系
Hibernate是一個開源的ORM(對象關系映射)框架,用於將Java程序中的對象映射到數據庫中的關系型數據。在Hibernate中,持久化類是用來映射Java對象和關系型數據庫表的類。
編寫Hibernate持久化類需要遵循以下規則:
- 持久化類必須有一個無參構造函數,否則Hibernate無法創建對象。
- 持久化類必須映射到數據庫中的表,可以使用@Table註解指定表名。
- 持久化類的屬性必須與數據庫表的列一一對應,可以使用@Column註解指定列名。
- 持久化類必須有一個唯一標識符,可以使用@Id註解指定。
- 持久化類的屬性可以使用@Basic註解指定是否為基本類型,如字符串、數字等。
- 持久化類的屬性可以使用@Transient註解指定不需要持久化到數據庫中。
在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>
其中標簽中的class屬性指定主鍵生成策略的方式,identity表示使用自增方式生成主鍵。
Hibernate的持久化類的三種狀態
在Hibernate中,持久化類有三種狀態:瞬時狀態、持久狀態和遊離狀態。
- 瞬時狀態:持久化類對象沒有與Session關聯,也沒有被保存到數據庫中,此時修改對象的屬性不會被保存到數據庫。
- 持久狀態:持久化類對象已經被保存到數據庫中,並與Session關聯,此時修改對象的屬性會被保存到數據庫。
- 遊離狀態:持久化類對象已經被保存到數據庫中,但是與Session已經脫離關系,此時修改對象的屬性不會被保存到數據庫。
可以使用Session的save、persist、update、merge方法來將持久化類對象從瞬時狀態轉換為持久狀態或遊離狀態。
save方法用於將瞬時狀態的對象保存到數據庫中,並返回持久狀態的對象。如果對象已經是持久狀態,則不執行任何操作。
persist方法用於將瞬時狀態的對象保存到數據庫中,不返回持久狀態的對象。如果對象已經是持久狀態,則不執行任何操作。
update方法用於將遊離狀態的對象更新到數據庫中,並返回持久狀態的對象。如果對象是瞬時狀態,則拋出異常。
merge方法用於將遊離狀態的對象合並到Session中,並返回持久狀態的對象。如果對象是瞬時狀態,則將對象保存到數據庫中並返回持久狀態的對象。
Hibernate的一級緩存
Hibernate的一級緩存是Session級別的緩存,用於緩存持久化類對象。當從數據庫中查詢持久化類對象時,Hibernate會先從一級緩存中查找,如果緩存中不存在,則從數據庫中查詢,並將查詢結果放入一級緩存中。
一級緩存的生命周期與Session相同,當Session關閉時,一級緩存也會被清空。可以使用Session的evict、clear方法來清空一級緩存。
evict方法用於將指定的對象從一級緩存中移除,使得對象變成遊離狀態。
clear方法用於清空一級緩存中的所有對象,將所有持久狀態的對象變成遊離狀態。
Hibernate的事務管理
在Hibernate中,事務用於保證對數據庫的操作具有原子性、一致性、隔離性和持久性。可以使用Transaction接口來管理事務,例如:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); try { // 執行數據庫操作 tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); }
在事務中,可以使用Session的save、persist、update、merge、delete等方法來操作持久化類對象,並在事務提交時將操作結果保存到數據庫中。
Hibernate的其他API
除瞭以上介紹的API外,Hibernate還提供瞭許多其他的API,例如:
- Criteria API:用於動態查詢持久化類對象。
- HQL(Hibernate Query Language):一種基於SQL的查詢語言,用於查詢持久化類對象。
- Named Query:將HQL查詢語句保存在持久化類中,方便重復使用。
- Second-level Cache:用於緩存持久化類對象,提高查詢效率。
以上是Hibernate的持久化類編寫規則、主鍵生成策略、持久化類狀態、一級緩存、事務管理和其他API等內容的介紹。希望本文能夠幫助讀者更好地理解Hibernate框架的使用。
Hibernate的實體類關系映射
在Hibernate中,實體類之間的關系可以通過註解、XML配置文件或者Java代碼來進行映射。常用的關系有一對一、一對多、多對一和多對多。
一對一關系
一對一關系表示兩個實體類之間的關系是一對一的關系。在Hibernate中,可以使用@OneToOne註解來進行映射。
例如,一個Person實體類和一個IDCard實體類之間的關系是一對一的關系,可以使用如下的代碼進行映射:
@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實體類中使用瞭@OneToOne註解來映射與IDCard實體類的關系,屬性mappedBy指定瞭IDCard實體類中的person屬性與Person實體類中的idCard屬性之間的關系,cascade屬性指定瞭級聯操作。
IDCard實體類中使用瞭@OneToOne註解來映射與Person實體類的關系,屬性JoinColumn指定瞭Person實體類中與IDCard實體類關聯的外鍵列名。
一對多關系
一對多關系表示一個實體類可以對應多個另一個實體類的對象。在Hibernate中,可以使用@OneToMany註解來進行映射。
例如,一個Department實體類中有多個Employee實體類的對象,可以使用如下的代碼進行映射:
@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實體類中使用瞭@OneToMany註解來映射與Employee實體類的關系,屬性mappedBy指定瞭Employee實體類中的department屬性與Department實體類中的employees屬性之間的關系,cascade屬性指定瞭級聯操作。
Employee實體類中使用瞭@ManyToOne和@JoinColumn註解來映射與Department實體類的關系,屬性JoinColumn指定瞭Department實體類中與Employee實體類關聯的外鍵列名。
多對一關系
多對一關系表示多個實體類可以對應一個另一個實體類的對象。在Hibernate中,可以使用@ManyToOne註解來進行映射。
例如,一個Employee實體類所屬於一個Department實體類,可以使用如下的代碼進行映射:
@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實體類中使用瞭@ManyToOne和@JoinColumn註解來映射與Department實體類的關系,屬性JoinColumn指定瞭Department實體類中與Employee實體類關聯的外鍵列名。
多對多關系
多對多關系表示多個實體類之間互相關聯。在Hibernate中,可以使用@ManyToMany註解來進行映射。
例如,一個Student實體類可以選擇多個Course實體類,一個Course實體類也可以有多個Student實體類,可以使用如下的代碼進行映射:
@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實體類中使用瞭@ManyToMany註解來映射與Course實體類的關系,屬性mappedBy指定瞭Course實體類中的students屬性與Student實體類中的courses屬性之間的關系,cascade屬性指定瞭級聯操作。
Course實體類中使用瞭@ManyToMany和@JoinTable註解來映射與Student實體類的關系,屬性JoinTable指定瞭關聯表的名稱和兩個實體類之間的關聯關系。
以上是Hibernate的實體類關系映射的相關介紹,希望本文能夠幫助讀者更好地掌握Hibernate框架的使用。
到此這篇關於Java Hibernate中的持久化類和實體類關系的文章就介紹到這瞭,更多相關Java Hibernate持久化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mybatis-Plus自動生成的數據庫id過長的解決
- SpringBoot2 JPA解決懶加載異常的問題
- JPA如何設置表名和實體名,表字段與實體字段的對應
- SpringBoot2 實現JPA分頁和排序分頁的案例
- 關於@Entity和@Table註解的用法詳解