web-dev-qa-db-ja.com

ゲッターがある場合、Hibernateは常にセッターを必要としますか?

両方の注釈が付いたHibernateのgetterメソッドがあります@Columnおよび@Basic

対応するセッターがない場合、例外が発生します。どうしてこれなの?

この場合、ゲッターから返された値を取得し(DBに格納するため)、セッターには機能的な目的はありません。したがって、エラー状態を回避するための空のメソッドがあります。

57
Marcus Leon

他の人が言及したように、プロパティゲッターメソッドに注釈を付けると、Hibernateはデータベースから値を読み取るときにセッターを使用します。基本的に、Hibernateは、データベースに書き込むものはすべて、最終的にデータベースから読み取る必要があると想定しています。これは、ゲッターに注釈を付ける場合、データベースからオブジェクトを読み取るときにセッターを呼び出す必要があることを意味します。

セッターをプライベートにすることができます(Hibernateはリフレクターを使用してセッターにアクセスします)。これは、リレーショナルマッピングにHibernateを使用しながら、クラスのコントラクトを保持するための素晴らしい方法です。

フィールドがクラスの他のプロパティから派生している場合、なぜデータベースに保存するのですか? @Transient データベースに保存しないフィールドをマークするための注釈。 @Formula Hibernateがフィールドを取得するための注釈(データベースに送信するクエリの式を使用してこれを行います)。

75
Jim Hurne

クラスに@Entity(access = AccessType.FIELD)アノテーションを付け、属性にアノテーションを付ける必要があります。これで問題が解決するはずです。セッターは、リファクタリングをサポートする最良の方法です。そして、そこに小さなセッターを持つことの問題は何ですか。

9
khmarbaise

セットする - 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>
5
vsingh

Hibernateはsetメソッドを使用して、DBから読み込んでいるエンティティを初期化します。

おそらく、エンティティフィールドのアクセス修飾子をdefaultまたはprotectedまたはpublicにすると、Hibernateはセッターを使用せずにフィールドを直接初期化します(私はそれについて読んでいますが、動作することを確認してください)。しかし、セッターを使用する方がはるかに好ましい方法です。

1
Roman