我有一些哲学直觉,即添加未映射到DB的字段会破坏实体类,并且是解决问题的错误方法。
但是,是否有任何具体情况使用@Transient
字段导致隐含和难以解决的问题?
例如,当我们的实体中有@Transient
个字段时,添加或删除二级缓存是否可能会破坏我们的应用?
大量更新:在对@Transient
字段进行一些思考之后,在我看来@Transient
字段应该以正确的方式使用。
通过“正确的方式”,我的意思是实体总是应该具有相同的行为。这意味着当getter根据@Transient字段值不时返回null
时,这是一个非常容易出错的行为。这意味着@Transient字段应始终初始化。
我只看到2例正确用法:
@Transient字段应该在object的构造函数中初始化:
@Entity
public class SomeEntity
@Id
private long id;
@Transient
private String transientField;
public SomeEntity () {
transientField = "some string";
}
...
}
@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;
}
...
}
任何人都可以对这两起案件进行评论或描述我错过的其他案件吗?
答案 0 :(得分:1)
我在一些持有hibernate的项目中使用Transient注释,并且还没有任何问题。
它通常用于可由其他持久属性确定的字段,并且使用缓存也应该起作用,因为Javas序列化机制(缓存通常期望缓存的对象可序列化)也会考虑Transient注释。我认为最好使用瞬态getter和setter属性,尽可能提供信息而不是实例字段。