我想避免序列化(在JMS / AMF中),但仍然使用JPA / Hibernate保留字段。
transient
修饰符是我的朋友吗? @Transient
注释和transient
修饰符是否相关?
java规范确切地说,系统服务不会将瞬态字段保存到持久存储中。但是hibernate是一个系统服务吗? (我不这么认为) http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#78119
和java.io.Serialisable
接缝表明要求out.writeObject
and in.readObject
进行序列化
http://download.oracle.com/javase/1.4.2/docs/api/java/io/Serializable.html
有什么见解?
也许我应该写一个快速测试,但我会对一个规范更有信心。
谢谢!
答案 0 :(得分:6)
transient
修饰符是我的朋友吗?@Transient
注释和transient
修饰符是否相关?
他们并非真正相关,但我担心他们不会成为你的朋友,Hibernate / JPA不会保留transient
属性。 JPA规范如下:
2.1.1持久字段和属性
实体的持久状态是 由持久性提供程序访问 运行时通过JavaBeans样式 属性访问者或通过实例 变量。单一访问类型(字段 或财产访问)适用于 实体层次。注释时 使用,映射的位置 对持久性的注释 字段或持久属性 entity class指定访问类型 作为领域 - 或财产 - 基于访问分别。
- 如果实体具有基于字段的访问权限,则为持久性提供程序 运行时访问实例变量 直。 所有非
transient
实例变量不是 使用Transient
进行注释 注释是持久的。什么时候 使用基于字段的访问 对象/关系映射注释 为实体类注释 实例变量。- 如果实体具有基于属性的访问权限,则为持久性提供程序 运行时通过访问持久状态 属性访问方法。所有 没有注释的属性
Transient
注释是持久的。 属性访问器方法必须是 公众或受保护的。什么时候 使用基于属性的访问权限 对象/关系映射注释 为实体类注释 getter属性访问者。- 映射注释不能应用于那些字段或属性 是
transient
或Transient
。- 如果应用了映射注释,则未指定行为 持久字段和属性 或者如果XML描述符指定使用 一个不同的访问类型 类层次结构。
...
答案 1 :(得分:3)
Pascal Thivent发布的JPA规范部分看起来相当令人困惑。实际上,Hibernate在使用字段访问时会尊重transient
,但在属性访问的情况下会忽略。也许这是一种特定于Hibernate的行为。
例如,在这种情况下,bar
未序列化,但仍保留在数据库中:
@Entity
@Access(AccessType.FIELD) // Default access type - field
public class Foo {
@Id @GeneratedValue
private Long id;
transient private String bar;
...
@Access(AccessType.PROPERTY) // Override default access type for this property
public String getBar() { return bar; }
}
编辑:由于目前尚不清楚此行为是如何符合JPA规范的,因此更好的选择是为transient
字段和相应的属性使用不同的名称。
答案 2 :(得分:1)
尝试提供writeObject(ObjectOutputStream oos)
实现,该实现不会调用oos.defaultWriteObject()
,而是手动编写所有必需的属性。
但我不确定这是否可行,谷歌是否必须首先致电defaultWriteObject
。