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属性访问器。- 映射注释不能应用于
transient
或Transient
字段或属性 。- 如果将映射注释应用于持久字段和属性,或者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
。
- 保存具有复杂关系的实体时的StaleStateException
- 引起:java.io.FileNotFoundException:无法打开ServletContext资源
- Spring引用JPA在TABLE中插入大写名称和Hibernate
- 无法在Spring Security中识别身份validation提供程序user-service-ref
- 在自动触发的默认侦听器之前,激活Hibernate自定义事件侦听器
- Hibernate“PreInsertEvent.getSource()”NoSuchMethodError
- Hibernate – Custom Dialect的BigDecimal列映射
- Hibernate查询示例和预测
- JPA中的其他查询