2

私は、休止状態を使用するためにテーブルをマップするクラスを持っています。定数として使うマッピングのために無視したい変数があります。そして私は、私はこのようにそれをコーディングような特性から一定の値をロードする:@Transientアノテーションで@Valueアノテーションを使用することはできませんか?

@Transient 
@Value("${something.value}") 
private int MY_VALUE; 

をしかし、私は@value注釈付き@Transientアノテーションを使用することはできません、MY_VALUEの値は常に0に設定されていますか?それとも私は何かを逃した?

+0

のようなものは、それが '0'に設定され続けて? – bluefoot

+0

@bluefootこの問題が原因でプロジェクトがエラーをスローすると削除された場合http://stackoverflow.com/questions/4662582/how-to-make-hibernate-ignore-class-variables-that-are-not-mapped –

答えて

4

@Valueを使用して、SpringがBeanを作成するときに読み込むプロパティ値を指定します。

しかし、データベースからデータをロードするためにHibernateを使用している場合、Springはこれらのクラスをインスタンス化しません。したがって、@Value注釈は効果がありません。あなたは `@ Transient`アノテーションを削除する場合

私は休止状態からこれらのエンティティをロードするDAOへ@Valueを注入することをお勧め、

public class FooDao { 
    @Value("...") 
    private int yourConfiguredValue; 

    public getFoo() { 
     Foo foo = sessionFactory.getCurrentSession().get(...); 
     foo.setYourValue(yourConfiguredValue); 
     return foo; 
    } 
} 
+0

それはいい代案です!ありがとう。 –

+0

私は 'List foos = ...'のようなリストとして 'foo'を取得します。ループのあるすべてのオブジェクトに '@ Value'を注入するのは良い考えですか? –

+2

各オブジェクトに値を追加する必要がある場合は、他の方法はありますか?しかし、定数であれ、プロパティファイルであれ、この値をエンティティオブジェクトにアタッチしないことを検討します。特にFooの各インスタンスに関連するようには聞こえません。私は@Valueを他のクラスにつけるつもりです。 –

4

これらの2つの注釈は、異なるドメインに属します。

@Transientはエンティティに属し、@ValueはSpring Beansに属します。エンティティはJPA/Hibernateによって管理され、Spring BeansはSpringによって管理されます。 2つを混ぜるのは良い考えではありません。

これを達成するにはusing the @Configurable annotationとAspectJのコンパイルまたはロードタイムウィービングがありますが、このようなハッキングには強くお勧めします。エンティティではなく@Valueを保持するには、Spring Beanを使用してください。

関連する問題