欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Hibernate中的持久化類和實體類關(guān)系

 更新時間:2023年04月29日 10:23:06   作者:互聯(lián)小助手  
Hibernate是一種Java對象關(guān)系映射框架,通過持久化類將Java對象映射到數(shù)據(jù)庫表中。持久化類需要實現(xiàn)無參構(gòu)造器、具有標(biāo)識屬性和使用注解或XML進(jìn)行映射。Hibernate通過Session來管理對象的狀態(tài),包括臨時狀態(tài)、持久化狀態(tài)和游離狀態(tài)

Hibernate是一個開源的ORM(對象關(guān)系映射)框架,用于將Java程序中的對象映射到數(shù)據(jù)庫中的關(guān)系型數(shù)據(jù)。在Hibernate中,持久化類是用來映射Java對象和關(guān)系型數(shù)據(jù)庫表的類。

編寫Hibernate持久化類需要遵循以下規(guī)則:

  • 持久化類必須有一個無參構(gòu)造函數(shù),否則Hibernate無法創(chuàng)建對象。
  • 持久化類必須映射到數(shù)據(jù)庫中的表,可以使用@Table注解指定表名。
  • 持久化類的屬性必須與數(shù)據(jù)庫表的列一一對應(yīng),可以使用@Column注解指定列名。
  • 持久化類必須有一個唯一標(biāo)識符,可以使用@Id注解指定。
  • 持久化類的屬性可以使用@Basic注解指定是否為基本類型,如字符串、數(shù)字等。
  • 持久化類的屬性可以使用@Transient注解指定不需要持久化到數(shù)據(jù)庫中。

在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):瞬時狀態(tài)、持久狀態(tài)和游離狀態(tài)。

  • 瞬時狀態(tài):持久化類對象沒有與Session關(guān)聯(lián),也沒有被保存到數(shù)據(jù)庫中,此時修改對象的屬性不會被保存到數(shù)據(jù)庫。
  • 持久狀態(tài):持久化類對象已經(jīng)被保存到數(shù)據(jù)庫中,并與Session關(guān)聯(lián),此時修改對象的屬性會被保存到數(shù)據(jù)庫。
  • 游離狀態(tài):持久化類對象已經(jīng)被保存到數(shù)據(jù)庫中,但是與Session已經(jīng)脫離關(guān)系,此時修改對象的屬性不會被保存到數(shù)據(jù)庫。

可以使用Session的save、persist、update、merge方法來將持久化類對象從瞬時狀態(tài)轉(zhuǎn)換為持久狀態(tài)或游離狀態(tài)。

save方法用于將瞬時狀態(tài)的對象保存到數(shù)據(jù)庫中,并返回持久狀態(tài)的對象。如果對象已經(jīng)是持久狀態(tài),則不執(zhí)行任何操作。

persist方法用于將瞬時狀態(tài)的對象保存到數(shù)據(jù)庫中,不返回持久狀態(tài)的對象。如果對象已經(jīng)是持久狀態(tài),則不執(zhí)行任何操作。

update方法用于將游離狀態(tài)的對象更新到數(shù)據(jù)庫中,并返回持久狀態(tài)的對象。如果對象是瞬時狀態(tài),則拋出異常。

merge方法用于將游離狀態(tài)的對象合并到Session中,并返回持久狀態(tài)的對象。如果對象是瞬時狀態(tài),則將對象保存到數(shù)據(jù)庫中并返回持久狀態(tài)的對象。

Hibernate的一級緩存

Hibernate的一級緩存是Session級別的緩存,用于緩存持久化類對象。當(dāng)從數(shù)據(jù)庫中查詢持久化類對象時,Hibernate會先從一級緩存中查找,如果緩存中不存在,則從數(shù)據(jù)庫中查詢,并將查詢結(jié)果放入一級緩存中。

一級緩存的生命周期與Session相同,當(dāng)Session關(guān)閉時,一級緩存也會被清空。可以使用Session的evict、clear方法來清空一級緩存。

evict方法用于將指定的對象從一級緩存中移除,使得對象變成游離狀態(tài)。

clear方法用于清空一級緩存中的所有對象,將所有持久狀態(tài)的對象變成游離狀態(tài)。

Hibernate的事務(wù)管理

在Hibernate中,事務(wù)用于保證對數(shù)據(jù)庫的操作具有原子性、一致性、隔離性和持久性。可以使用Transaction接口來管理事務(wù),例如:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
try {
    // 執(zhí)行數(shù)據(jù)庫操作
    tx.commit();
} catch (Exception e) {
    tx.rollback();
} finally {
    session.close();
}

在事務(wù)中,可以使用Session的save、persist、update、merge、delete等方法來操作持久化類對象,并在事務(wù)提交時將操作結(jié)果保存到數(shù)據(jù)庫中。

Hibernate的其他API

除了以上介紹的API外,Hibernate還提供了許多其他的API,例如:

  • Criteria API:用于動態(tài)查詢持久化類對象。
  • HQL(Hibernate Query Language):一種基于SQL的查詢語言,用于查詢持久化類對象。
  • Named Query:將HQL查詢語句保存在持久化類中,方便重復(fù)使用。
  • Second-level Cache:用于緩存持久化類對象,提高查詢效率。

以上是Hibernate的持久化類編寫規(guī)則、主鍵生成策略、持久化類狀態(tài)、一級緩存、事務(wù)管理和其他API等內(nèi)容的介紹。希望本文能夠幫助讀者更好地理解Hibernate框架的使用。

Hibernate的實體類關(guān)系映射

在Hibernate中,實體類之間的關(guān)系可以通過注解、XML配置文件或者Java代碼來進(jìn)行映射。常用的關(guān)系有一對一、一對多、多對一和多對多。

一對一關(guān)系

一對一關(guān)系表示兩個實體類之間的關(guān)系是一對一的關(guān)系。在Hibernate中,可以使用@OneToOne注解來進(jìn)行映射。

例如,一個Person實體類和一個IDCard實體類之間的關(guān)系是一對一的關(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實體類中使用了@OneToOne注解來映射與IDCard實體類的關(guān)系,屬性mappedBy指定了IDCard實體類中的person屬性與Person實體類中的idCard屬性之間的關(guān)系,cascade屬性指定了級聯(lián)操作。

IDCard實體類中使用了@OneToOne注解來映射與Person實體類的關(guān)系,屬性JoinColumn指定了Person實體類中與IDCard實體類關(guān)聯(lián)的外鍵列名。

一對多關(guān)系

一對多關(guān)系表示一個實體類可以對應(yīng)多個另一個實體類的對象。在Hibernate中,可以使用@OneToMany注解來進(jìn)行映射。

例如,一個Department實體類中有多個Employee實體類的對象,可以使用如下的代碼進(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實體類中使用了@OneToMany注解來映射與Employee實體類的關(guān)系,屬性mappedBy指定了Employee實體類中的department屬性與Department實體類中的employees屬性之間的關(guān)系,cascade屬性指定了級聯(lián)操作。

Employee實體類中使用了@ManyToOne和@JoinColumn注解來映射與Department實體類的關(guān)系,屬性JoinColumn指定了Department實體類中與Employee實體類關(guān)聯(lián)的外鍵列名。

多對一關(guān)系

多對一關(guān)系表示多個實體類可以對應(yīng)一個另一個實體類的對象。在Hibernate中,可以使用@ManyToOne注解來進(jìn)行映射。

例如,一個Employee實體類所屬于一個Department實體類,可以使用如下的代碼進(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實體類中使用了@ManyToOne和@JoinColumn注解來映射與Department實體類的關(guān)系,屬性JoinColumn指定了Department實體類中與Employee實體類關(guān)聯(lián)的外鍵列名。

多對多關(guān)系

多對多關(guān)系表示多個實體類之間互相關(guān)聯(lián)。在Hibernate中,可以使用@ManyToMany注解來進(jìn)行映射。

例如,一個Student實體類可以選擇多個Course實體類,一個Course實體類也可以有多個Student實體類,可以使用如下的代碼進(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實體類中使用了@ManyToMany注解來映射與Course實體類的關(guān)系,屬性mappedBy指定了Course實體類中的students屬性與Student實體類中的courses屬性之間的關(guān)系,cascade屬性指定了級聯(lián)操作。

Course實體類中使用了@ManyToMany和@JoinTable注解來映射與Student實體類的關(guān)系,屬性JoinTable指定了關(guān)聯(lián)表的名稱和兩個實體類之間的關(guān)聯(lián)關(guān)系。

以上是Hibernate的實體類關(guān)系映射的相關(guān)介紹,希望本文能夠幫助讀者更好地掌握Hibernate框架的使用。

到此這篇關(guān)于Java Hibernate中的持久化類和實體類關(guān)系的文章就介紹到這了,更多相關(guān)Java Hibernate持久化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用java寫Student類的功能

    如何使用java寫Student類的功能

    這篇文章主要介紹了如何使用java寫Student類的功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Spring?boot?CommandLineRunner啟動任務(wù)傳參實例詳解

    Spring?boot?CommandLineRunner啟動任務(wù)傳參實例詳解

    在使用SpringBoot構(gòu)建項目時,我們通常有一些預(yù)先數(shù)據(jù)的加載,下面這篇文章主要給大家介紹了關(guān)于Spring?boot?CommandLineRunner啟動任務(wù)傳參的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • java.lang.NoClassDefFoundError錯誤解決辦法

    java.lang.NoClassDefFoundError錯誤解決辦法

    這篇文章主要介紹了java.lang.NoClassDefFoundError錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java 實現(xiàn)讀取clob

    java 實現(xiàn)讀取clob

    這篇文章主要介紹了java 如何實現(xiàn)讀取clob,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • java在cmd運行"-d"和"-cp"參數(shù)解讀

    java在cmd運行"-d"和"-cp"參數(shù)解讀

    這篇文章主要介紹了java在cmd運行"-d"和"-cp"參數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Mabatis錯誤提示Parameter index out of range的處理方法

    Mabatis錯誤提示Parameter index out of range的處理方法

    這篇文章主要介紹了Mabatis錯誤提示Parameter index out of range 的處理方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • 一文帶你認(rèn)識Java中的Object類和深淺拷貝

    一文帶你認(rèn)識Java中的Object類和深淺拷貝

    任何變成語言中,其實都有淺拷貝和深拷貝的概念,Java 中也不例外,下面這篇文章主要給大家介紹了關(guān)于Java中Object類和深淺拷貝的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 淺談java+內(nèi)存分配及變量存儲位置的區(qū)別

    淺談java+內(nèi)存分配及變量存儲位置的區(qū)別

    下面小編就為大家?guī)硪黄獪\談java+內(nèi)存分配及變量存儲位置的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 簡單了解Java編程中拋出異常的方法

    簡單了解Java編程中拋出異常的方法

    這篇文章主要介紹了Java編程中拋出異常的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Java RabbitMQ高級特性詳細(xì)分析

    Java RabbitMQ高級特性詳細(xì)分析

    為了保證消息的可靠性傳輸,包括投遞消息的生產(chǎn)方能投遞成功,和消息消費的消費方正確消費,RabbitMQ 提供了兩個確認(rèn)機制,由于消息按照流通的順序從左到右,因此為保證可靠性,MQ必須對 Producer進(jìn)行確認(rèn),Consumer 必須對 MQ 進(jìn)行確認(rèn)
    2022-08-08

最新評論