との両方で注釈が付けられたHibernateゲッターメソッドがいくつか@Column
あり@Basic
ます。
対応するセッターがない場合は例外が発生します。どうしてこれなの?
この例では、(DBに格納されるために)ゲッターから返された値を取得しており、セッターには機能的な目的はありません。したがって、エラー状態を回避するための空のメソッドがあります。
との両方で注釈が付けられたHibernateゲッターメソッドがいくつか@Column
あり@Basic
ます。
対応するセッターがない場合は例外が発生します。どうしてこれなの?
この例では、(DBに格納されるために)ゲッターから返された値を取得しており、セッターには機能的な目的はありません。したがって、エラー状態を回避するための空のメソッドがあります。
他の人が述べたように、プロパティゲッターメソッドにアノテーションを付けると、Hibernateはデータベースから値を読み取るときにセッターを使用します。基本的に、Hibernateは、データベースに書き込んでいるものはすべて、最終的にデータベースから読み取る必要があると想定しています。これは、ゲッターに注釈を付ける場合、データベースからオブジェクトを読み取るときにセッターを呼び出す必要があることを意味します。
セッターをプライベートにすることができます(Hibernateはリフレクションを使用してセッターにアクセスします)。これは、リレーショナルマッピングにHibernateを使用しながら、クラスのコントラクトを保持するための優れた方法です。
フィールドがクラス内の他のプロパティから派生している場合、なぜそれをデータベースに保存するのですか?注釈を使用し@Transient
て、データベースに保存してはならないフィールドにマークを付けることができます。アノテーションを使用@Formula
して、Hibernateにフィールドを派生させることもできます(これは、データベースに送信するクエリの数式を使用して行われます)。
クラスに@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
か、Hibernateがsetterを使用せずにフィールドを直接初期化するprotected
場合public
(私はそれについて何か読んだのですが、それが機能するかどうかはわかりません)。しかし、セッターを使用する方がはるかに好ましい方法です。
セッターを使用せず、プライベート属性を使用する場合、Hibernateはリフレクションによってフィールドを取得し、field.setAccessible(true)を実行する必要があります。Hibernateはそうは思わない。
Hibernateにそうするように指示できるかどうかはわかりませんが、私が覚えている限り、デフォルトの構成はセッターを使用しています...ログ/ sysoutをセットに配置すると、セッターが使用されていることがわかります。