我正在使用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;
}
答案 0 :(得分:1)
创建类Serializable并不意味着其中的所有内容都是可序列化的。您的类中的所有引用(依赖项/属性),它们本身应该是可序列化的,反过来它们的引用。
根据上述异常,您的会话bean似乎引用了EntityManagerFactoryImpl对象,该对象不可序列化,因此也是错误。
要解决此问题,您可以将其定义为transient
,而不是将其序列化,但在反序列化过程中只会遇到问题,您必须手动构建对象或分配参考。
我建议您查看Serilization上的这篇文章。
如何解决这个问题,我不做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;
}
希望这有助于!!!!
答案 1 :(得分:0)
您只需添加:
transient EntityManagerFactory entityManagerFactory;
但是如果有任何其他实现 entityManagerFactory 的对象,则该对象也必须定义为。例如
transient static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("porpertiesConexion");
transient EntityManager em;
public void beginTransaction() {
em = emf.createEntityManager(); //
//code....
}