首页 文章

JPA在持久化期间忽略字段的最快方法?

提问于
浏览
210

我基本上正在寻找一个“@Ignore”类型的注释,我可以用它来阻止特定字段被持久化 . 怎么能实现这一目标?

6 回答

  • 21

    @Transient符合您的需求 .

  • 2

    要忽略一个字段,请使用@Transient注释它,以便它不会被hibernate映射 .

    但转换为JSON时的字段为 jackson will not serialize .

    If you need mix JPA with JSON (由JPA省略,但仍包含在 Jackson 中)使用@JsonInclude

    @JsonInclude()
    @Transient
    private String token;
    

    TIP:

    token == null 时,您还可以在反序列化期间使用JsonInclude.Include.NON_NULL并隐藏JSON中的字段:

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Transient
    private String token;
    
  • 348

    要忽略一个字段,请使用 @Transient 注释它,以便它不会被hibernate映射 .
    资料来源:Hibernate Annotations .

  • 64

    这个答案有点晚了,但它完成了回复 .

    为了避免实体中的字段持久存储在DB中,可以使用以下两种机制之一:

    @Transient - 将字段标记为不可持久的JPA注释

    java中的 transient 关键字 . 注意 - 使用此关键字,将阻止该字段与java中的任何序列化机制一起使用 . 因此,如果必须序列化该字段,则最好只使用 @Transient 注释 .

  • 1

    为了完成上述答案,我得到了使用XML映射文件的情况,其中 @Transienttransient 都没有工作......我必须将瞬态信息放在xml文件中:

    <attributes>
    (...)
        <transient name="field" />
    </attributes>
    
  • 15

    使用Hibernate 5.2.10,Jersey 2.25.1和Jackson 2.8.9,上述答案都不适用于我 . 我终于找到了答案(有点,他们引用了hibernate4module,但它也适用于5)here . 没有任何Json注释与 @Transient 一起工作 . 显然Jackson2足够'smart'足以忽略标有 @Transient 的东西,除非你明确告诉它不要 . 关键是添加hibernate5模块(我用它来处理其他Hibernate注释)并禁用我的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>
    

相关问题