我正在使用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....
}