2012-05-31 3 views
0

Я читаю JPA 2.0. Я встречаю фразу,Что означает сериализация от одной виртуальной машины к другой при использовании JPA

We have used the transient modifier instead of the @Transient annotation so that 
if the Employee gets serialized from one VM to another then the translated name 
will get reinitialized to correspond to the locale of the new VM. 

@Entity 
public class Employee { 
    @Id private int id; 
    private String name; 
    private long salary; 
    transient private String translatedName; 
    // ... 
    public String toString() { 
     if (translatedName == null) { 
      translatedName = ResourceBundle.getBundle("EmpResources").getString("Employee"); 
     } 
     return translatedName + ": " + id + " " + name; 
    } 
} 

То, что я понял, что, когда мы используем @Entity аннотаций и контейнер сталкиваются с ней, то его называют поставщика JPA, что делать вещи. Как и идентификатор столбца id ID в базе данных. Хотя мы не упоминали аннотацию @Column о имени и зарплате, но по умолчанию она сопоставляется с столбцом NAME и SALARY в базе данных. Мы использовали переходный процесс для translameName, поэтому JAP оставляет его как есть, а не сопоставляется с ним. Это просто поле в этом классе. Но я не в состоянии понять предложение

if the Employee gets serialized from one VM to another 

Кто-нибудь, пожалуйста, объясните мне это? Также скажите мне, что то, что я определил выше о рабочем процессе JAP, является правильным? Как то, что происходит, когда контейнер сталкивается с аннотацией @Entity?

Благодаря

ответ

2

Когда класс реализует интерфейс java.io.Serializable, экземпляры этого класса сериализации. Это означает, что JVM может преобразовать объект в последовательность байтов. Эти байты могут быть отправлены по сети или сохранены на диске и могут быть прочитаны другой виртуальной машиной и преобразованы обратно в объект Java.

Если поле имеет ключевое слово Java transient, это означает, что этот механизм будет проигнорирован этим механизмом сериализации. Поле не будет сериализовано.

Поле, аннотированное @Transient, рассматривается как непостоянное поле JPA. Он не сохранит его в базе данных, и он не будет загружать его из базы данных. Но он будет сериализован, если объект отправлен в другую JVM.

Ключевое слово Java transient автоматически создает поле @Transient. Это означает, что поле transient не будет сериализовано и не будет сохранено JPA.

+0

Hhhhmm спасибо. Вы имеете в виду, если я использую annotaion '@ Transient', тогда данные этого поля не будут сохраняться в базе данных, но это будет Serialize, если мои сотрудники Calss реализуют интерфейс Serializable. Но с переходным ключевым словом, ни сохранить в базу данных, ни стать serializabe, даже если мой класс Employee реализует Serializable? Я прав? – Basit

+0

У вас все в порядке. –

+0

Спасибо :) Еще одна вещь, когда мы говорим, сохраняем сущность, это означает сохранение записи в базе данных. Если запись не сохраняется в базе данных, мы не можем сказать, что она сохраняется? – Basit

0

В «мире JEE5» вы можете использовать отдельные объекты, так как вы использовали бы объекты переноса. (Я не сужу, это хорошая идея или нет!)

Таким образом, вы можете вызвать, например, метод службы (например, метод SLSB EJB 3), который удаленно возвращает экземпляр Employee с помощью обычной семантики удаленного вызова относительно сериализации.

Следует отметить, что если экземпляр Employee был успешно сериализован, то ваше Java Runtime может быть нарушено, так как класс не реализует Serializable.

0

Если вы не хотите сохранять состояние своего объекта arrtibute в DB, ​​а также не хотите, чтобы состояние передавалось другому jvm, используйте ключевое слово Transient.

Если вы не хотите сохранять состояние своего объекта arrtibute в DB, ​​но хотите, чтобы состояние было передано другому jvm, используйте аннотацию @Transient.

Смежные вопросы