63

との両方で注釈が付けられたHibernateゲッターメソッドがいくつか@Columnあり@Basicます。

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

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

4

5 に答える 5

81

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

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

フィールドがクラス内の他のプロパティから派生している場合、なぜそれをデータベースに保存するのですか?注釈を使用し@Transientて、データベースに保存してはならないフィールドにマークを付けることができます。アノテーションを使用@Formulaして、Hibernateにフィールドを派生させることもできます(これは、データベースに送信するクエリの数式を使用して行われます)。

于 2010-04-20T17:28:44.763 に答える
12

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

于 2010-04-20T16:19:05.783 に答える
10

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>
于 2014-12-01T21:11:42.913 に答える
1

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

たぶん、エンティティフィールドのアクセス修飾子を作成するdefaultか、Hibernateがsetterを使用せずにフィールドを直接初期化するprotected場合public(私はそれについて何か読んだのですが、それが機能するかどうかはわかりません)。しかし、セッターを使用する方がはるかに好ましい方法です。

于 2010-04-20T16:12:59.103 に答える
-1

セッターを使用せず、プライベート属性を使用する場合、Hibernateはリフレクションによってフィールドを取得し、field.setAccessible(true)を実行する必要があります。Hibernateはそうは思わない。

Hibernateにそうするように指示できるかどうかはわかりませんが、私が覚えている限り、デフォルトの構成はセッターを使用しています...ログ/ sysoutをセットに配置すると、セッターが使用されていることがわかります。

于 2010-04-20T16:23:11.920 に答える