0

我正在阅读 JPA 2.0。我遇到一个句子

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 列。我们在translatedName 上使用了transient,因此JAP 保持原样,而不是对其应用映射。它只是这个类中的一个字段。但我无法理解这句话

if the Employee gets serialized from one VM to another

有人请给我解释一下吗?还告诉我上面关于 JAP 工作流程的定义是正确的吗?就像容器遇到@Entity 注解时会发生什么?

谢谢

4

3 回答 3

2

当一个类实现java.io.Serializable接口时,这个类的实例是可序列化的。这意味着 JVM 可以将对象转换为字节序列。这些字节可以通过网络发送,或者保存在磁盘上,并且可以被另一个 VM 读取并转换回 Java 对象。

如果一个字段有transientJava 关键字,则意味着该字段将被此序列化机制忽略。该字段不会被序列化。

带有注释@Transient的字段被 JPA 视为非持久字段。它不会将其保存在数据库中,也不会从数据库中加载它。但是如果对象被发送到另一个JVM,它将被序列化。

Javatransient关键字自动生成一个字段@Transient。这意味着一个transient字段不会被序列化,也不会被 JPA 保存。

于 2012-05-31T07:23:17.880 回答
0

在“JEE5 世界”中,您可以像使用传输对象一样使用分离的实体。(我不判断这是否是一个好主意!)

因此,您可以调用例如一个服务方法(例如 EJB 3 SLSB 方法),该方法使用关于序列化的通常远程调用语义远程返回一个 Employee 实例。

应该注意的是,如果 Employee 的实例被成功序列化,那么您的 Java 运行时可能会被破坏,因为该类没有实现 Serializable。

于 2012-05-31T07:45:44.570 回答
0

如果您不想将实体的状态保存到 DB 并且也不希望将状态转移到另一个 jvm,请使用Transient关键字。

如果您不想将实体的状态保存到 DB,但希望将状态转移到另一个 jvm,则使用@Transient注释。

于 2012-06-01T05:20:41.807 回答