JPA最快的方式来在持久性期间忽略一个字段?
我基本上正在寻找一个“@Ignore”types的注释,我可以阻止一个特定的领域被持久化。 这怎么能实现?
@Transient
符合您的需求。
要忽略一个字段,用@Transient
对它进行注释,这样它就不会被hibernate映射。
但jackson转换为JSON时不会序列化字段。
如果您需要将JPA与JSON混合 (由JPA省略,但仍包含在Jackson中),请使用@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注释 。
这个答案有点晚了,但它完成了答复。
为了避免来自实体的字段被持久化在DB中,可以使用以下两种机制之一:
@Transient – 标记为不可持久的字段的JPA注释
在Java中的瞬态关键字。 注意 – 使用这个关键字,将会阻止这个字段和java的任何序列化机制一起使用。 所以,如果该字段必须被序列化,那么最好使用@Transient注解。
为了完成上面的答案,我使用了一个XML映射文件,@ transient
和transient
都没有工作…我不得不将瞬态信息放在xml文件中:
<attributes> (...) <transient name="field" /> </attributes>
上面的答案都没有为我使用hibernate5.2.10,泽西岛2.25.1和jackson2.8.9。 我终于find了答案(有点,他们引用hibernate4module,但也适用于5) 在这里 。 Json注释都没有@Transient
。 显然jackson2是“聪明的”,足以忽略标有@Transient
东西,除非你明确地告诉它不要。 关键是添加hibernate5模块(我正在使用它来处理其他Hibernate注释),并在我的Jersey应用程序中禁用USE_TRANSIENT_ANNOTATION
function:
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>