Hibernate / JPA учитывает модификатор переходного процесса (не аннотацию) - PullRequest
6 голосов
/ 20 октября 2010

Я хочу избежать сериализации (в 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 ]

6 голосов
/ 20 октября 2010

Является ли модификатор transient моим другом? @Transient аннотация и модификатор transient связаны или не все?

Они не на самом деле связаны, но я боюсь, что они все равно не будут вашим другом, свойства transient не сохраняются Hibernate / JPA. В спецификации JPA это выглядит так:

2.1.1 Постоянные поля и свойства

Постоянное состояние объекта доступ к поставщику постоянства время выполнения либо через стиль JavaBeans средства доступа к собственности или через экземпляр переменные. Единый тип доступа (поле или доступ к собственности) относится к иерархия объектов. Когда аннотации используется, размещение отображения аннотации на постоянном поля или постоянные свойства класс сущности определяет тип доступа как поле или свойство - на основе доступа соответственно.

  • Если объект имеет полевой доступ, поставщик сохраняемости время выполнения обращается к переменным экземпляра непосредственно. Все не- transient переменные экземпляра, которые не являются с комментариями Transient аннотации являются постоянными. когда полевой доступ используется, аннотации объектно-реляционного отображения для класса сущности аннотировать переменные экземпляра.
  • Если объект имеет доступ на основе свойств, поставщик сохраняемости во время выполнения обращается к постоянному состоянию через методы доступа к свойствам. Все свойства не аннотированы с Transient аннотации являются постоянными. Методы доступа к свойству должны быть публичный или защищенный. когда доступ на основе собственности используется, аннотации объектно-реляционного отображения для класса сущности аннотировать средства доступа к свойствам getter.
  • Картографические аннотации нельзя применять к полям или свойствам, которые transient или Transient.
  • Поведение не определено, если к отображению применяются аннотации как постоянные поля и свойства или если XML-дескриптор определяет использование разных типов доступа в пределах иерархия классов.

...

Ссылки

Похожие вопросы

3 голосов
/ 20 октября 2010

Часть спецификации 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 и соответствующего свойства.

1 голос
/ 20 октября 2010

Попробуйте предоставить writeObject(ObjectOutputStream oos) реализацию, которая не вызывает oos.defaultWriteObject(), но вручную записывает все необходимые свойства.

Но я не уверен, что это может сработать, гугл, нужно ли в первую очередь звонить defaultWriteObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...