2012-09-10 10 views
11

この質問は本質的にthis oneの反対です。Hibernateにメソッドを無視させる方法は?

私はそうのような方法があります:私はそれをロードすると

public boolean isVacant() { 
    return getEmployeeNum() != null && getEmployeeNum().equals("00000000"); 
} 

を、Hibernateは私がvacant何の属性を呼ばなかったことを不平を言っています。しかし、私はvacantという属性を必要としません - 私はそのデータを格納する必要はありません - それは単にロジックです。

Hibernateは言う:

org.hibernate.PropertyNotFoundException:クラスcom.mycomp.myclassで空いているプロパティのセッターを見つけることができませんでしたが...

は、私が追加することができ、注釈があります私のisVacant()メソッドにHibernateにそれを無視させる方法はありますか?

答えて

25

@Transientをメソッドに追加すると、Hibernateはそれを無視する必要があります。あなたは@Transientとしてそれに注釈を付けていない限り、永続的な考えられているエンティティの(アクセスタイプに応じて、フィールドやメソッド)

すべての非静的非過渡特性:

Hibernate Documentationを引用します。

+0

Doh - 私は '@ Transient'はフィールドのためだと思っていました... – corsiKa

3

RNJは正しいですが、これはなぜ起こるか私が追加される場合があります:

を私はあなたの永続クラスのゲッターを注釈を付けていることを推測しています。 Java Beanで使用される接頭辞は "set"と "get"です。これは変数の読み書きに使用されますが、接頭辞 "is"もあります( "get"ではなく)ブール値に使用されます。 Hibernateがgetter-annotated永続クラスを見て、メソッド "isVacant"を見つけたら、プロパティ "vacant"があると仮定し、 "set"メソッドもあると仮定します。

これを修正するには、@ Transientアノテーションを追加するか、メソッドの名前を "is"で始まらないものに変更することができます。あなたのクラスがgetメソッドの代わりにフィールドに注釈が付けられていれば、これが問題になるとは思わない。

+3

しかし、メソッドの名前を変更する際の問題は、それも規約を破るということです。慣例により、ブール値(メンバーであるかどうかにかかわらず)を返すメソッドは、isまたはhasで始まります。 'java.util.Collection'メソッド' isEmpty() 'を考えてみましょう - ほとんどのコレクションは、空であるかどうかを保存しません。サイズを0と比較します(これは、すべてのコレクションで当てはまりません。例えば、' ConcurrentLinkedQueue'しかし、ほとんどの場合、 'AbstractCollection'はそれをそのまま実装しています。) – corsiKa

関連する問題