搜尋
首頁Javajava教程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的實體類別關係映射

在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指定了关联表的名称和两个实体类之间的关联关系。

以上是Java Hibernate中持久化類別與實體類別的關係是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具