代码之家  ›  专栏  ›  技术社区  ›  Antoine Claval

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

  •  6
  • Antoine Claval  · 技术社区  · 15 年前

    我想避免序列化(在JMS/AMF中),但仍然用JPA/Hibernate保存该字段。

    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 回复  |  直到 6 年前
        1
  •  6
  •   Community Mohan Dere    8 年前

    transient 修饰我的朋友?是 @Transient 瞬变的

    他们不是 相关的,但恐怕他们不会是你的朋友, Hibernate/JPA没有持久化属性。JPA规范如下:

    2.1.1持久字段和属性

    实体的持久状态是 由持久性提供程序访问 通过JavaBeans样式运行时 属性访问器或via实例 变量。单一访问类型(字段 实体层次结构。当注释是 在持久的 的字段或持久属性 实体类指定访问类型 作为字段或属性- 分别基于访问。

    • 如果实体具有基于字段的访问,则持久性提供程序 直接的。 全无- 瞬变的 注释为 Transient 使用基于字段的访问 对象/关系映射注释 对于实体类,请注释 实例变量。
    • 运行时通过 属性访问器方法。全部 属性未用 瞬变的 注释是持久的。 属性访问器方法必须是 使用基于属性的访问 对于实体类,请注释 getter属性访问器。
    • 映射批注不能应用于 是 瞬变的 瞬变的 .
    • 如果映射注释应用于 持久字段和属性 中的不同访问类型 类层次结构。

    ...

    工具书类

    相关问题

        2
  •  3
  •   axtavt    15 年前

    Pascal Thivent发布的JPA规范部分看起来相当混乱。实际上,Hibernate尊重 transient

    例如,在这种情况下 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规范的,也许更好的选择是为 字段和相应的属性。

        3
  •  1
  •   Roman    15 年前

    尽量提供 writeObject(ObjectOutputStream oos) oos.defaultWriteObject() 但是手动写入所有必需的属性。

    但我不确定这是否可行,谷歌是否有必要 defaultWriteObject 第一。