1

Hibernate ORM の実装で完全に混乱したと思います。

私の理解では、Hibernate を使用すると DAO レイヤーを削除できます。必須である(または有利でさえある)わけではありませんが、そうすることができます。

しかし、私の場合、これがどのように起こるかわかりません。私のシステムの 2 つのエンティティである Company と CompanyRegistration を使用して、私のケースを説明します。

カンパニークラス -

@Entity
@Table(name = "Company")
public class Company extends LightEntity implements BaseSerializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "Code")
    private String code;

    @Column(name = "Name")
    private String name;

    @Column(name = "Address")
    private String address;

    @Column(name = "ContactNumber1")
    private String contactNumber1;

    @Column(name = "ContactNumber2")
    private String contactNumber2;

    @Column(name = "EMail")
    private String email;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = CascadeType.ALL)
    private List<CompanyRegistration> companyRegistrations;

    public Company(String code, String name) {
        this.code = code;
        this.name = name;
    }

    // getters and setters follow..
}

CompanyRegistration クラス -

@Entity
@Table(name = "CompanyRegistration")
public class CompanyRegistration extends LightEntity implements BaseSerializable {

    @Id
    @Column(name = "RegistrationNumber")
    private String registrationNumber;
    @Column(name = "YearOfRegistration")
    private String yearOfRegistration;
    @ManyToOne
    @JoinColumn(name = "CompanyId", nullable = false)
    private Company company;

    public CompanyRegistration(String registrationNumber, String yearOfRegistration, Company company) {
        this.registrationNumber = registrationNumber;
        this.yearOfRegistration = yearOfRegistration;
        this.company = company;
    }

    public String getRegistrationNumber() {
        return registrationNumber;
    }
    public String getYearOfRegistration() {
        return yearOfRegistration;
    }
    public String getCompanyId() {
        return company.Id;
    }
}

Company クラスではCascadeType.All、Hibernate が保存、更新、削除などのカスケード操作を処理し、それらをデータベースに永続化するように指定しました。したがって、CompanyRegistration コレクションの変更は、そのデータベース テーブルに直接反映されます。したがって、Hibernate は、CompanyRegistration コレクションを永続化するという私のニーズに応えます。

ただし、Company オブジェクトを永続化するには、DAO レイヤーを使用する必要がありますね。標準 SQL の代わりにそのレイヤーで HQL を使用できることは理解していますが、それは私の関心事ではありません。別のレイヤーがまだあります。

ここでの概念を誤解している可能性が最も高いです。

それで、私の質問はこれが物事の仕組みですか?また、キャッシング (ここで私にとって大きなプラス)、自動永続化コレクション (所有者オブジェクトではありません)、HQL (まだ使用していないためコメントできません) 以外に、Hibernate が提供する利点は何ですか?

4

3 に答える 3

1

Hibernate の最大の利点は、オブジェクト リレーショナル マッピングです。リレーショナル データとオブジェクトの間のマッピングが自動的に行われます。Hibernate を使用しない場合は、独自のコードを記述して、毎回取得したデータ セットからドメイン オブジェクトまたはオブジェクトのリストを手動で作成する必要があります。

一例として、Hibernate を使用してオブジェクトを取得するsession.get(objectId)と、いわゆるマネージド オブジェクトが返されます。トランザクションがコミットされると、Hibernate はこのオブジェクトに対してダーティ チェック (変更のチェック) を実行し、必要に応じて変更を db にフラッシュします。実際に更新操作を呼び出す必要はありません。

その他の利点は次のとおりです。

  • LazyLoading: リレーショナル コレクションは、すべてを一度に読み込むのではなく、後で必要に応じて読み込むことができます。コレクションが大きい場合、必要なときにすべてをロードすると多くのメモリが消費されるため、パフォーマンスが向上します。
  • 並行処理: Hibernate は、OptimisticLocking などの並行処理を処理する機能を提供します。OptimisticLocking を使用している場合、オブジェクトがデータベースに保存されるたびに、バージョン列の競合がチェックされ、存在する場合は例外がスローされます。

それ以外の場合は、これらのシナリオを処理するために独自に実装する必要があります。

EntityManager と Session の違いについては、Hibernate による 2 つの ORM API 実装です。EntityManager はJPAの実装です。構文と使用法にはいくつかの違いがあります。これらのいずれかを使用することを選択できます。そして、あなたは1つに固執する方が良いです。これら 2 つを混合するプログラムを見てきました。

于 2013-01-24T09:46:24.207 に答える
1

DAO layer別名Data Access Objectsレイヤー自体の意味を理解していないと思います。どのような ORM ツールを使用する場合でも、常に DAO レイヤーが必要です。すべてのエンティティには、DAO レイヤーに DAO クラスがあります。各エンティティ クラスがセッション オブジェクトを作成し、永続オブジェクトで hibernate API の save()、update()、delete() などを呼び出すのはこのレイヤーです。はい、休止状態でHQLについて学ぶ必要があります。createQuery() api のような hibernate の特定の機能で使用します。そしてDAOパターンについてこれを読んでください。

于 2013-01-24T09:29:11.763 に答える
1

DAO 実装は、EntityManager からメソッドを呼び出すためだけに使用されます。挿入する SQL または HQL を作成する必要はありません。EntityManager の persist メソッドを呼び出すことで簡単に実行できます。

public class CompanyDAOImpl{

    public void save(Company company){ 
        entityManager.persist(company) 
    }

}

entityManager は、スプリング構成によって設定することも、オブジェクトに設定することもできます...作成方法によって異なります。

于 2013-01-24T05:03:10.727 に答える