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

时间:2010-10-20 09:37:58

标签: java hibernate serialization jpa persistence

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

有什么见解?

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

谢谢!

3 个答案:

答案 0 :(得分:6)

  

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

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

  

2.1.1持久字段和属性

     

实体的持久状态是   由持久性提供程序访问   运行时通过JavaBeans样式   属性访问者或通过实例   变量。单一访问类型(字段   或财产访问)适用于   实体层次。注释时   使用,映射的位置   对持久性的注释   字段或持久属性   entity class指定访问类型   作为领域 - 或财产 -   基于访问分别。

     
      
  • 如果实体具有基于字段的访问权限,则为持久性提供程序   运行时访问实例变量   直。 所有非transient   实例变量不是   使用Transient 进行注释   注释是持久的。什么时候   使用基于字段的访问   对象/关系映射注释   为实体类注释   实例变量。
  •   
  • 如果实体具有基于属性的访问权限,则为持久性提供程序   运行时通过访问持久状态   属性访问方法。所有   没有注释的属性   Transient注释是持久的。   属性访问器方法必须是   公众或受保护的。什么时候   使用基于属性的访问权限   对象/关系映射注释   为实体类注释   getter属性访问者。
  •   
  • 映射注释不能应用于那些字段或属性   是transientTransient
  •   
  • 如果应用了映射注释,则未指定行为   持久字段和属性   或者如果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