0

我正在使用 EclipseLink (JPA 2.0) 在 netbeans 中运行 JSF + Primefaces + tomcat 6.0.32 的环境。

我的应用程序运行良好,但是每次运行它时,我都会收到很多警告说不能序列化我的会话 bean,并为每个会话 bean 显示这样的块:

18-jul-2012 23:05:46 org.apache.catalina.session.StandardSession writeObject
ADVERTENCIA: No puedo serializar atributo de sesión facturacionController para sesión 62A53325838E1E7C6EB6607B1E7965E6
java.io.NotSerializableException: org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    ... and so on...

问题是我的会话 bean 已经实现了可序列化。那么我能做些什么来解决这个问题呢?

谢谢 !

---- 添加信息 07/20/2012 ----

我从会话 bean 中引用 EntityManager 的唯一一点是当我在 getter 属性中创建 jpaController 时,如下所示:

private JpaController getJpaController() {
    if (jpaController == null) {
        jpaController = new JpaController(Persistence.createEntityManagerFactory("myPersistenceUnit"));
    }
    return jpaControllerPedido;
}

那是因为我这样定义了 jpaController 构造函数:

public JpaController(EntityManagerFactory emf) {
    this.emf = emf;
}
4

2 回答 2

1

使类 Serializable 并不意味着其中的所有内容都是可序列化的。类中的所有引用(依赖项/属性),它们本身应该是可序列化的,反过来也是它们的引用。

根据上述异常,您的会话 bean 似乎引用了不可序列化的 EntityManagerFactoryImpl 对象,因此出现错误。

为了解决这个问题,您可以将其定义为transient不会被序列化,但唯一的问题是在反序列化期间您必须手动构建对象或分配引用。

我建议看看这篇关于序列化的文章。

如何解决这个问题,我不做 JPA,所以无法判断是否有相同的序列化类,

为了解决它,将参考定义为transient

transient EntityManagerFactory entityManagerFactory

并在反序列化挂钩方法中手动将引用分配回 bean,如下所述。

private void readObject(java.io.ObjectInputStream stream)
        throws java.io.IOException, ClassNotFoundException
    {
        stream.defaultReadObject();

        // assign reference manually.
        this.entityManagerFactory =  //get from factory;
    }

希望这可以帮助 !!!!

于 2012-07-19T05:24:06.167 回答
0

你只添加这个:

transient EntityManagerFactory entityManagerFactory;

但是如果有任何其他实现 entityManagerFactory 的对象,这个对象也必须定义为。例如

transient static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("porpertiesConexion");
transient EntityManager em;    


public void beginTransaction() {           
    em = emf.createEntityManager();  //
        //code....
} 
于 2021-03-30T23:17:48.030 回答