両方の注釈が付いたHibernateのgetterメソッドがあります@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
またはprotected
またはpublic
にすると、Hibernateはセッターを使用せずにフィールドを直接初期化します(私はそれについて読んでいますが、動作することを確認してください)。しかし、セッターを使用する方がはるかに好ましい方法です。