Is Hibernate / JPA taking in consideration the transient modifier ( not the annotation )

倾然丶 夕夏残阳落幕 提交于 2019-11-27 06:19:48

问题


I want to avoid serialisation ( in JMS / AMF ) but still persist the field with JPA/Hibernate.

Is the transient modifier my friend ? Are @Transient annotation and the transient modifier related or not a all ?

The java specification precise that a transient field will not be saved to a persistent storage by a system service. But is hibernate a system service ? ( i dont think so ) http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#78119

And java.io.Serialisable seams to indicate that a out.writeObject and in.readObject are called for serialisation http://download.oracle.com/javase/1.4.2/docs/api/java/io/Serializable.html

Any insight ?

Maybe should i just write a quick test, but i will be more confident with a piece of spec.

Thank !


回答1:


Is the transient modifier my friend ? Are @Transient annotation and the transient modifier related or not a all ?

They are not really related but I'm afraid they won't be your friend anyway, transient properties aren't persisted by Hibernate/JPA. The JPA specification puts it like this:

2.1.1 Persistent Fields and Properties

The persistent state of an entity is accessed by the persistence provider runtime either via JavaBeans style property accessors or via instance variables. A single access type (field or property access) applies to an entity hierarchy. When annotations are used, the placement of the mapping annotations on either the persistent fields or persistent properties of the entity class specifies the access type as being either field - or property - based access respectively.

  • If the entity has field-based access, the persistence provider runtime accesses instance variables directly. All non-transient instance variables that are not annotated with the Transient annotation are persistent. When field-based access is used, the object/relational mapping annotations for the entity class annotate the instance variables.
  • If the entity has property-based access, the persistence provider runtime accesses persistent state via the property accessor methods. All properties not annotated with the Transient annotation are persistent. The property accessor methods must be public or protected. When property-based access is used, the object/relational mapping annotations for the entity class annotate the getter property accessors.
  • Mapping annotations cannot be applied to fields or properties that are transient or Transient.
  • The behavior is unspecified if mapping annotations are applied to both persistent fields and properties or if the XML descriptor specifies use of different access types within a class hierarchy.

...

References

  • JPA 1.0 specification
    • Section 2.1.1 Persistent Fields
  • Hibernate Core Reference Guide
    • 2.2.2. Mapping simple properties

Related questions

  • Why does JPA have a @Transient annotation?



回答2:


The part of JPA specification posted by Pascal Thivent looks rather confusing. Actually, Hibernate respects transient when field access is used, but ignores in the case of property access. Perhaps it's a Hibernate-specifc behaviour.

For example, in this case bar is not serialized, but still persisted to the database:

@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; }
}

EDIT: Since it's unclear how this behaviour conforms to the JPA Specification, perhaps the better choice is to use different names for the transient field and the corresponding property.




回答3:


Try to provide writeObject(ObjectOutputStream oos) implementation which doesn't make a call to oos.defaultWriteObject() but manually writes all necessary properties.

But I'm not sure that this can work, google whether or not it's strictly necessary to call defaultWriteObject first.



来源:https://stackoverflow.com/questions/3976469/is-hibernate-jpa-taking-in-consideration-the-transient-modifier-not-the-anno

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!