无法序列化会话 Bean - 引发警告



我正在使用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已经实现了Serializable。那么我该怎么办才能解决这个问题呢?

谢谢!

----添加信息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;
}

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

根据上面的异常,您的会话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;
    }

希望这能有所帮助!!!!

您只需添加以下内容:

transient EntityManagerFactory entityManagerFactory;

但是,如果有任何其他实现entityManagerFactory的对象,则该对象也必须定义为

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

public void beginTransaction() {           
    em = emf.createEntityManager();  //
        //code....
} 

相关内容

  • 没有找到相关文章

最新更新