首頁  >  文章  >  Java  >  Java Hibernate中持久化類別與實體類別的關係是什麼?

Java Hibernate中持久化類別與實體類別的關係是什麼?

王林
王林轉載
2023-05-08 18:19:181283瀏覽

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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除