web-dev-qa-db-ja.com

永続化中にJPAでフィールドを無視する最速の方法は?

基本的に、特定のフィールドの永続化を停止できる「@Ignore」タイプの注釈を探しています。どうすればこれを達成できますか?

230
m2o

@Transient ニーズに応じます。

383
cletus

フィールドを無視するには、 @Transient で注釈を付けて、休止状態によってマップされないようにします。

ただし、jacksonはJSONに変換するときにフィールドをシリアル化しません

JPAとJSONを混在させる必要がある場合(JPAでは省略し、ジャクソンには含めます) @JsonInclude を使用します:

@JsonInclude()
@Transient
private String token;

ヒント:

また、 JsonInclude.Include.NON_NULL を使用して、token == nullの場合のデシリアライズ中にJSONのフィールドを非表示にすることもできます。

@JsonInclude(JsonInclude.Include.NON_NULL)
@Transient
private String token;
82
user3871754

フィールドを無視するには、@Transientアノテーションを付けて、hibernateによってマップされないようにします。
出典: Hibernate Annotations

21
Jonathan

この回答は少し遅れていますが、応答は完了しています。

エンティティからのフィールドがDBに保持されるのを避けるために、次の2つのメカニズムのいずれかを使用できます。

@ Transient -フィールドを持続不可能としてマークするJPAアノテーション

transientJavaのキーワード。注意-このキーワードを使用すると、Javaのシリアル化メカニズムでフィールドが使用されなくなります。そのため、フィールドをシリアル化する必要がある場合は、@ Transient注釈のみを使用することをお勧めします。

15
Olimpiu POP

上記の回答を完了するには、@Transienttransientも機能しないXMLマッピングファイルを使用する場合がありました... xmlファイルに一時的な情報を入れる必要がありました。

<attributes>
(...)
    <transient name="field" />
</attributes>
2
Vinze

Hibernate 5.2.10、Jersey 2.25.1、およびJackson 2.8.9を使用した場合、上記の回答はどれもうまくいきませんでした。私は最終的に答えを見つけました(彼らはhibernate4moduleを参照していますが、5でも機能します) here 。 Jsonアノテーションはいずれも@Transientではまったく機能しませんでした。明らかに、Jackson2は、@Transientでマークされたものを明示的に無視しない限り、親切に無視するのに十分な「スマート」です。重要なのは、(他のHibernateアノテーションを処理するために使用していた)hibernate5モジュールを追加し、JerseyアプリケーションのUSE_TRANSIENT_ANNOTATION機能を無効にすることでした。

ObjectMapper jacksonObjectMapper = new ObjectMapper();
Hibernate5Module jacksonHibernateModule = new Hibernate5Module();
jacksonHibernateModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
jacksonObjectMapper.registerModule(jacksonHibernateModule);  

Hibernate5Moduleの依存関係は次のとおりです。

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.9</version>
</dependency>
1
Hodglem