Hibernateは、ゲッターがいるときは常にセッターが必要ですか?
-
28-09-2019 - |
質問
両方に注釈が付けられたHibernate Getter Methodがいくつかあります @Column
と @Basic
.
対応するセッターがない場合は、例外を取得します。どうしてこれなの?
私たちの場合、ゲッターから返された値を導き出しています(DBに保存されるため)、セッターには機能的な目的はありません。したがって、エラー状態を回避する空の方法があります。
解決
他の人が言及したように、プロパティゲッターメソッドに注釈を付けた場合、データベースから値を読むときにHibernateはセッターを使用します。基本的に、Hibernateは、データベースに書き込んでいるものはすべて、最終的にデータベースから読み取る必要があると想定しています。これは、ゲッターに注釈を付けた場合、データベースからオブジェクトを読むときにセッターを呼び出す必要があることを意味します。
セッターをプライベートにすることができます(Hibernateはリフレクションを使用してセッターにアクセスします)。これは、リレーショナルマッピングのために冬眠を使用しながら、クラスの契約を維持するための素晴らしい方法です。
フィールドがクラス内の他のプロパティから派生している場合、なぜデータベースに保存するのですか?使用できます @Transient
注釈は、データベースに保存されるべきではないというフィールドをマークします。使用することもできます @Formula
冬眠にフィールドを導き出すための注釈(データベースに送信するクエリの式を使用してこれを行います)。
他のヒント
クラスに注釈を付けてください @Entity(access = AccessType.FIELD)
属性に注釈を付けます。これはあなたの問題を解決するはずです。セッターは、リファクタリングをサポートする最良の方法です。そして、そこに小さなセッターを持つことの問題は何ですか。
セットする access="field"
セッターを使用したくない場合:
<class name="com.demo.hibernate.Country" table="country">
<id name="countryId" column="id" type="int">
<generator class="increment" />
</id>
<property name="name" column="name" access="field" type="string" />
<property name="countryCode" column="country_code" access="field" type="string" />
</class>
Hibernateは使用します set
DBから読んでいるエンティティを初期化する方法。
たぶん、エンティティフィールドのアクセス修飾子を作る場合 default
また protected
また public
その後、HibernateはSetterを使用せずにフィールドを直接初期化します(私はそれについて何かを読みましたが、それが機能するかどうかはわかりません)。しかし、セッターの使用ははるかに好ましい方法です。
セッターを使用せず、プライベート属性を使用しない場合、Hibernateは反射によってフィールドを取得し、field.setAccessible(true)を実行する必要があります。冬眠はそうするとは思わない。
冬眠するように言うことができるかどうかは本当にわかりませんが、私が覚えている限り、デフォルトの構成はセッターを使用しています...セットにログ/sysoutを置くと、セッターを使用することがわかります。