有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我觉得在实体中添加带有@Transient注释的字段非常容易出错。我说得对吗?

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

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

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

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

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

我只看到了两个正确使用的案例:

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

有谁能说出这两个案例,或者描述一下我错过的其他案例吗


共 (1) 个答案

  1. # 1 楼答案

    我在一些使用hibernate的项目中使用了瞬态注释,但还没有出现任何问题

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