Hibernate / JPA是否考虑了transiant修饰符(而不是注释)

我想避免序列化(在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

任何见解?

也许我应该写一个快速测试,但我会对一个规范更有信心。

谢谢 !

transient修饰符是我的朋友吗? @Transient注释和transient修饰符是否相关?

它们并没有真正相关,但我担心它们不会成为你的朋友,Hibernate / JPA不会保留transient属性。 JPA规范如下:

2.1.1持久字段和属性

持久性提供程序运行时通过JavaBeans样式属性访问器或实例变量访问实体的持久状态。 单一访问类型(字段或属性访问)适用于实体层次结构。 使用注释时,映射注释在实体类的持久字段或持久属性上的放置将访问类型分别指定为基于字段或基于属性的访问。

  • 如果实体具有基于字段的访问权限,则持久性提供程序运行时直接访问实例变量。 所有未使用Transient注释注释的transient实例变量都是持久的。 使用基于字段的访问时,实体类的对象/关系映射注释会注释实例变量。
  • 如果实体具有基于属性的访问权限,则持久性提供程序运行时通过属性访问器方法访问持久状态。 未使用Transient注释注释的所有属性都是持久的。 属性访问器方法必须是公共的或受保护的。 使用基于属性的访问时,实体类的对象/关系映射注释会注释getter属性访问器。
  • 映射注释不能应用于transientTransient字段或属性
  • 如果将映射注释应用于持久字段和属性,或者XML描述符指定在类层次结构中使用不同的访问类型,则行为未指定。

参考

  • JPA 1.0规范
    • 第2.1.1节持久字段
  • Hibernate核心参考指南
    • 2.2.2。 映射简单属性

相关问题

  • 为什么JPA有@Transient注释?

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字段和相应的属性使用不同的名称。

尝试提供writeObject(ObjectOutputStream oos)实现,该实现不会调用oos.defaultWriteObject()而是手动编写所有必需的属性。

但我不确定这是否可行,谷歌是否defaultWriteObject首先调用defaultWriteObject