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中,持久化類別有三種狀態:瞬時狀態、持久狀態和遊離狀態。
瞬時狀態:持久化類別物件沒有與Session關聯,也沒有被儲存到資料庫中,此時修改物件的屬性不會被儲存到資料庫。
持久狀態:持久化類別物件已經被儲存到資料庫中,並與Session關聯,此時修改物件的屬性會被儲存到資料庫。
遊離狀態:持久化類別物件已經被儲存到資料庫中,但是與Session已經脫離關係,此時修改物件的屬性不會被儲存到資料庫。
可以使用Session的save、persist、update、merge方法來將持久化類別物件從瞬時狀態轉換為持久狀態或遊離狀態。
save方法用於將瞬時狀態的物件儲存到資料庫中,並傳回持久狀態的物件。如果物件已經是持久狀態,則不執行任何操作。
persist方法用於將瞬時狀態的物件儲存到資料庫中,不傳回持久狀態的物件。如果物件已經是持久狀態,則不執行任何操作。
update方法用於將遊離狀態的物件更新到資料庫中,並傳回持久狀態的物件。如果物件是瞬時狀態,則拋出異常。
merge方法用於將遊離狀態的物件合併到Session中,並傳回持久狀態的物件。如果物件是瞬時狀態,則將物件儲存到資料庫中並傳回持久狀態的物件。
Hibernate的一級快取是Session層級的緩存,用於快取持久化類別物件。當從資料庫中查詢持久化類別物件時,Hibernate會先從一級快取中查找,如果快取中不存在,則從資料庫中查詢,並將查詢結果放入一級快取中。
一級快取的生命週期與Session相同,當Session關閉時,一級快取也會被清空。可以使用Session的evict、clear方法來清空一級快取。
evict方法用於將指定的物件從一級快取中移除,使得物件變成遊離狀態。
clear方法用於清空一級快取中的所有對象,將所有持久狀態的物件變成遊離狀態。
在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等方法來操作持久化類別對象,並在事務提交時將操作結果保存到資料庫中。
除了以上介紹的API外,Hibernate還提供了許多其他的API,例如:
Criteria API:用於動態查詢持久化類別物件。
HQL(Hibernate Query Language):一種基於SQL的查詢語言,用於查詢持久化類別物件。
Named Query:將HQL查詢語句儲存在持久化類別中,方便重複使用。
Second-level Cache:用於快取持久化類別對象,提高查詢效率。
在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中文網其他相關文章!