4

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

但是是否存在使用@Transient字段会导致隐含和难以修复的问题的具体情况?

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

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

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

而且我只看到 2 个正确使用的案例:

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

    @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;
       }       
       ...
    }
    

谁能评论这两个案例或描述我错过的其他案例?

4

1 回答 1

1

我在一些项目中使用 Transient 注释,这些项目也坚持休眠并且还没有任何问题。

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

于 2010-05-28T11:28:20.963 回答