基本的に、特定のフィールドの永続化を停止できる「@Ignore」タイプの注釈を探しています。どうすればこれを達成できますか?
@Transient
ニーズに応じます。
フィールドを無視するには、 @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;
フィールドを無視するには、@Transient
アノテーションを付けて、hibernateによってマップされないようにします。
出典: Hibernate Annotations 。
この回答は少し遅れていますが、応答は完了しています。
エンティティからのフィールドがDBに保持されるのを避けるために、次の2つのメカニズムのいずれかを使用できます。
@ Transient -フィールドを持続不可能としてマークするJPAアノテーション
transientJavaのキーワード。注意-このキーワードを使用すると、Javaのシリアル化メカニズムでフィールドが使用されなくなります。そのため、フィールドをシリアル化する必要がある場合は、@ Transient注釈のみを使用することをお勧めします。
上記の回答を完了するには、@Transient
もtransient
も機能しないXMLマッピングファイルを使用する場合がありました... xmlファイルに一時的な情報を入れる必要がありました。
<attributes>
(...)
<transient name="field" />
</attributes>
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>