我觉得向实体添加标有@Transient注释的字段非常容易出错。我对吗?

时间:2010-05-28 11:13:14

标签: java hibernate jpa transient

我有一些哲学直觉,即添加未映射到DB的字段会破坏实体类,并且是解决问题的错误方法。

但是,是否有任何具体情况使用@Transient字段导致隐含和难以解决的问题?

例如,当我们的实体中有@Transient个字段时,添加或删除二级缓存是否可能会破坏我们的应用?

大量更新:在对@Transient字段进行一些思考之后,在我看来@Transient字段应该以正确的方式使用。

通过“正确的方式”,我的意思是实体总是应该具有相同的行为。这意味着当getter根据@Transient字段值不时返回null时,这是一个非常容易出错的行为。这意味着@Transient字段应始终初始化。

我只看到2例正确用法:

  1. @Transient字段应该在object的构造函数中初始化:

    @Entity
    public class SomeEntity
       @Id
       private long id;
    
       @Transient
       private String transientField;
    
       public SomeEntity () {
          transientField = "some string";
       }       
       ...
    }
    
  2. @Transient字段可以延迟初始化:

    @Entity
    public class SomeEntity
       @Id
       private long id;
    
       @Transient
       private String transientField;
    
       public String getTransientField () {
          synchronized (lock) {
             if (transientField == null) {
                transientField = "some string";
             }   
          }
          return transientField;
       }       
       ...
    }
    
  3. 任何人都可以对这两起案件进行评论或描述我错过的其他案件吗?

1 个答案:

答案 0 :(得分:1)

我在一些持有hibernate的项目中使用Transient注释,并且还没有任何问题。

它通常用于可由其他持久属性确定的字段,并且使用缓存也应该起作用,因为Javas序列化机制(缓存通常期望缓存的对象可序列化)也会考虑Transient注释。我认为最好使用瞬态getter和setter属性,尽可能提供信息而不是实例字段。