ホームページ >Java >&#&チュートリアル >Java Hibernate における永続クラスとエンティティ クラスの関係は何ですか?

Java Hibernate における永続クラスとエンティティ クラスの関係は何ですか?

王林
王林転載
2023-05-08 18:19:181308ブラウズ

Hibernate はオープン ソースの ORM (オブジェクト リレーショナル マッピング) フレームワークで、Java プログラムのオブジェクトをデータベースのリレーショナル データにマップするために使用されます。 Hibernate では、永続クラスは Java オブジェクトとリレーショナル データベース テーブルをマップするために使用されるクラスです。

Hibernate 永続クラスを作成するには、次の規則に従う必要があります。

  • 永続クラスには引数のないコンストラクターが必要です。そうでない場合、Hibernate はオブジェクトを作成できません。

  • 永続クラスはデータベース内のテーブルにマップする必要があります。@Table アノテーションを使用してテーブル名を指定できます。

  • 永続クラスの属性は、データベース テーブルの列と 1 対 1 に対応する必要があります。@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 属性は、次のように指定します。主キー生成戦略の方法と識別手段を使用します。 主キーは自動インクリメントによって生成されます。

Hibernate の永続クラスの 3 つの状態

Hibernate では、永続クラスには一時状態、永続状態、および自由状態の 3 つの状態があります。

  • 一時状態: 永続クラス オブジェクトはセッションに関連付けられておらず、データベースにも保存されていません。この時点では、変更されたオブジェクトのプロパティはデータベース。

  • 永続状態: 永続クラス オブジェクトはデータベースに保存され、セッションに関連付けられています。この時点で、変更されたオブジェクトのプロパティはデータベースに保存されます。

  • 分離状態: 永続オブジェクトはデータベースに保存されましたが、セッションから切断されました。この時点では、変更されたオブジェクトのプロパティはデータベースに保存されません。

Session の save、persist、update、および merge メソッドを使用して、永続クラス オブジェクトを一時状態から永続状態または自由状態に変換できます。

save メソッドは、一時的な状態オブジェクトをデータベースに保存し、永続的な状態オブジェクトを返すために使用されます。オブジェクトがすでに永続的である場合、アクションは実行されません。

persist メソッドは、一時的な状態オブジェクトをデータベースに保存するために使用され、永続的な状態オブジェクトを返しません。オブジェクトがすでに永続的である場合、アクションは実行されません。

update メソッドは、フリー状態オブジェクトをデータベースに更新し、永続状態オブジェクトを返すために使用されます。オブジェクトが一時的な場合は、例外がスローされます。

merge メソッドは、自由状態オブジェクトをセッションにマージし、永続状態オブジェクトを返すために使用されます。オブジェクトが一時的な場合は、オブジェクトをデータベースに保存し、永続的な状態でオブジェクトを返します。

Hibernate の第 1 レベル キャッシュ

Hibernate の第 1 レベル キャッシュはセッション レベルのキャッシュであり、永続クラス オブジェクトをキャッシュするために使用されます。データベースから永続クラス オブジェクトをクエリする場合、Hibernate は最初に 1 レベル キャッシュからオブジェクトを検索し、キャッシュに存在しない場合はデータベースからクエリを実行し、クエリ結果を 1 レベル キャッシュに入れます。

一次キャッシュのライフサイクルはセッションのライフサイクルと同じであり、セッションが終了すると一次キャッシュもクリアされます。 Session の evict メソッドと clear メソッドを使用して、1 次キャッシュをクリアできます。

evict メソッドは、指定されたオブジェクトを 1 次キャッシュから削除し、オブジェクトを解放するために使用されます。

clear メソッドは、1 次キャッシュ内のすべてのオブジェクトをクリアし、すべての永続オブジェクトを自由な状態に変更するために使用されます。

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 ベースのクエリ言語。

  • 名前付きクエリ: HQL クエリ ステートメントを永続クラスに保存すると、簡単に再利用できます。

  • 第 2 レベル キャッシュ: クエリ効率を向上させるために永続クラス オブジェクトをキャッシュするために使用されます。

Hibernate のエンティティ クラス関係マッピング

Hibernate では、アノテーション、XML 設定ファイル、または Java コードを通じてエンティティ クラス間の関係をマッピングできます。一般的に使用される関係は、1 対 1、1 対多、多対 1、および多対多です。

一对一关系

一对一关系表示两个实体类之间的关系是一对一的关系。在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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。