中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java?Hibernate中的持久化類和實體類關系是什么

發布時間:2023-05-05 14:40:32 來源:億速云 閱讀:168 作者:iii 欄目:開發技術

這篇文章主要介紹“Java Hibernate中的持久化類和實體類關系是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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中的持久化類和實體類關系是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

周宁县| 泰州市| 玉田县| 丹巴县| 大理市| 南安市| 沧州市| 纳雍县| 莱阳市| 偏关县| 平舆县| 阿拉尔市| 华亭县| 东山县| 马边| 青阳县| 漳平市| 凤台县| 河池市| 金昌市| 岱山县| 临泽县| 曲水县| 耿马| 大埔区| 都匀市| 岫岩| 磴口县| 和田县| 武冈市| 罗源县| 酒泉市| 满洲里市| 台北县| 长兴县| 仁布县| 台安县| 渑池县| 赞皇县| 营口市| 定南县|