最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

  • 持久化類必須有一個(gè)無(wú)參構(gòu)造函數(shù),否則Hibernate無(wú)法創(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中,主鍵生成策略有多種,常見(jiàn)的有自增、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ì)象沒(méi)有與Session關(guān)聯(lián),也沒(méi)有被保存到數(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方法來(lái)將持久化類對(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ì)被清空??梢允褂肧ession的evict、clear方法來(lái)清空一級(jí)緩存。

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

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

Hibernate的事務(wù)管理

在Hibernate中,事務(wù)用于保證對(duì)數(shù)據(jù)庫(kù)的操作具有原子性、一致性、隔離性和持久性??梢允褂肨ransaction接口來(lái)管理事務(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等方法來(lái)操作持久化類對(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的持久化類編寫(xiě)規(guī)則、主鍵生成策略、持久化類狀態(tài)、一級(jí)緩存、事務(wù)管理和其他API等內(nèi)容的介紹。希望本文能夠幫助讀者更好地理解Hibernate框架的使用。

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

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

一對(duì)一關(guān)系

一對(duì)一關(guān)系表示兩個(gè)實(shí)體類之間的關(guān)系是一對(duì)一的關(guān)系。在Hibernate中,可以使用@OneToOne注解來(lái)進(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注解來(lái)映射與IDCard實(shí)體類的關(guān)系,屬性mappedBy指定了IDCard實(shí)體類中的person屬性與Person實(shí)體類中的idCard屬性之間的關(guān)系,cascade屬性指定了級(jí)聯(lián)操作。

IDCard實(shí)體類中使用了@OneToOne注解來(lái)映射與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注解來(lái)進(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注解來(lái)映射與Employee實(shí)體類的關(guān)系,屬性mappedBy指定了Employee實(shí)體類中的department屬性與Department實(shí)體類中的employees屬性之間的關(guān)系,cascade屬性指定了級(jí)聯(lián)操作。

Employee實(shí)體類中使用了@ManyToOne和@JoinColumn注解來(lái)映射與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注解來(lái)進(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注解來(lái)映射與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注解來(lái)進(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注解來(lái)映射與Course實(shí)體類的關(guān)系,屬性mappedBy指定了Course實(shí)體類中的students屬性與Student實(shí)體類中的courses屬性之間的關(guān)系,cascade屬性指定了級(jí)聯(lián)操作。

Course實(shí)體類中使用了@ManyToMany和@JoinTable注解來(lái)映射與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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明

    java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • shiro 與 SpringMVC的整合完美示例

    shiro 與 SpringMVC的整合完美示例

    shiro可以直接和spring整合,但是這樣需要單獨(dú)配置spring用于整合shiro,在配置springmvc,接下來(lái)通過(guò)實(shí)例代碼給大家介紹shiro 整合 SpringMVC 的方法,感興趣的朋友一起看看吧
    2021-08-08
  • 測(cè)試環(huán)境頻繁Full GC問(wèn)題的解決思路分析

    測(cè)試環(huán)境頻繁Full GC問(wèn)題的解決思路分析

    全文介紹了作者通過(guò)與調(diào)用方交互,發(fā)現(xiàn)welink-front服務(wù)不可用的問(wèn)題,通過(guò)jmap-heap和jstat-gccause命令,作者找到了問(wèn)題的原因是元數(shù)據(jù)區(qū)內(nèi)存使用率過(guò)高,觸發(fā)了FullGC,作者通過(guò)分析GC日志和堆內(nèi)存使用情況,確定了問(wèn)題的根本原因
    2025-01-01
  • Java調(diào)用.dll文件的方法

    Java調(diào)用.dll文件的方法

    因?yàn)轫?xiàng)目的需求,要在JAVA項(xiàng)目中調(diào)用Windows的Dll(動(dòng)態(tài)鏈接庫(kù))文件,之前用Jni調(diào)用過(guò)C寫(xiě)的Dll文件,比較麻煩,這里不多說(shuō),網(wǎng)上也有很多這方面的文檔。在網(wǎng)上找到一個(gè)開(kāi)源的組件JNative,使用后感覺(jué)比較方便
    2013-04-04
  • java單例模式實(shí)現(xiàn)的方法

    java單例模式實(shí)現(xiàn)的方法

    這篇文章主要介紹了如何在JAVA中實(shí)現(xiàn)單例模式,文中代碼簡(jiǎn)單易懂,供大家參考學(xué)習(xí),感興趣的小伙伴可以了解下
    2020-06-06
  • Java動(dòng)態(tài)腳本Groovy

    Java動(dòng)態(tài)腳本Groovy

    本文介紹了Java動(dòng)態(tài)腳本Groovy,Groovy是用于Java虛擬機(jī)的一種敏捷的動(dòng)態(tài)語(yǔ)言,它是一種成熟的面向?qū)ο缶幊陶Z(yǔ)言,既可以用于面向?qū)ο缶幊?,又可以用作純粹的腳本語(yǔ)言。使用該種語(yǔ)言不必編寫(xiě)過(guò)多的代碼,同時(shí)又具有閉包和動(dòng)態(tài)語(yǔ)言中的其他特性,需要的朋友可以參考一下
    2021-12-12
  • MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)

    MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)

    MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 詳解DES加密算法及在Java程序中的使用示例

    詳解DES加密算法及在Java程序中的使用示例

    這篇文章主要介紹了詳解DES加密算法及在Java程序中的使用示例,文中還有一個(gè)用Java實(shí)現(xiàn)的DES三重加密的例子,需要的朋友可以參考下
    2016-04-04
  • Java中常見(jiàn)的編碼集問(wèn)題總結(jié)

    Java中常見(jiàn)的編碼集問(wèn)題總結(jié)

    這篇文章主要為大家整理了一些Java中常見(jiàn)的編碼集問(wèn)題,文中的示例代碼講解詳細(xì),對(duì)我們深入理解Java有一定的幫助,感興趣的小伙伴可以了解一下
    2023-02-02
  • SpringBoot中FailureAnalyzer的使用詳解

    SpringBoot中FailureAnalyzer的使用詳解

    這篇文章主要介紹了SpringBoot中FailureAnalyzer的使用詳解,FailureAnalyzer攔截啟動(dòng)時(shí)異常,將異常轉(zhuǎn)換成更加易讀的信息并包裝成org.springframework.boot.diagnostics.FailureAnalysis對(duì)象,監(jiān)控應(yīng)用啟動(dòng)過(guò)程,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

荥经县| 乐陵市| 隆德县| 休宁县| 剑河县| 静海县| 柳河县| 沈阳市| 哈巴河县| 安图县| 铜川市| 喀喇沁旗| 扎赉特旗| 黄龙县| 虞城县| 成安县| 泸溪县| 将乐县| 新宾| 綦江县| 宣威市| 佛冈县| 土默特左旗| 胶南市| 当阳市| 阿瓦提县| 翁源县| 达拉特旗| 施秉县| 安宁市| 新巴尔虎左旗| 新野县| 铜梁县| 四平市| 巢湖市| 芦山县| 庆城县| 哈尔滨市| 昆明市| 元阳县| 耒阳市|