InvalidObjectException: Could not find a SessionFactory named: null
Tomcatサーバーの再起動後に取得しています。
私はいくつかの可能な解決策を見つけました:
この例外は、切断された Hibernate セッションをシリアライズして別の VM でデシリアライズしようとした場合、またはクラスローダーが再起動した場合 (アプリケーション サーバーまたは Web コンテナーでのホット再デプロイ中など) に発生します。これは Tomcat で特に顕著です。アプリケーション サーバーでは、ドキュメントに記載されているように、常に JNDI を使用して SessionFactory を格納します。Tomcat またはその他の Web コンテナーで、 コンテキストの再読み込み中の HttpSession シリアライゼーションを無効にします。これには、Web コンテナーのドキュメントで説明されている副作用があります。
どうすればいいですか?コンテキストのリロード中に HttpSession シリアライゼーションを無効にしますか?
注: Eclipse で Tomcat7 を使用しています。
アップデート:
でこのタグを有効にしようとしましたcontext.xml
:
<Manager pathname="" />
はい、例外は消えますが、永続的なセッションが失われるため、Tomcat サーバーの再起動後に再度ログインする必要があります。
JSFアプリケーションなどでTomcatを再起動した後、セッションを維持する必要がある(ログインによって新しいセッションを作成してはならない)と私が信じている場合、セッションの永続性をよく理解していますか?
UPDATE2 (セッションマネージャー):
@SessionScoped
@ManagedBean(name="userManager")
public class UserManager implements Serializable {
private static final long serialVersionUID = 1L;
private transient HttpSession session;
private String username;
private String password;
private User user;
public String login() {
// here is seraching for user in database (based on username and password)
if (user != null) {
FacesContext context = FacesContext.getCurrentInstance();
session = (HttpSession) context.getExternalContext().getSession(true);
session.setAttribute("id", user.getId());
session.setAttribute("username", user.getName());
...
return "success";
}
}
public String logout() {
user = null;
FacesContext context = FacesContext.getCurrentInstance();
session = (HttpSession) context.getExternalContext().getSession(true);
...
session.invalidate();
return "success";
}
// getters and setters ----------------------------------------------------
}
そして私のhibernate.cfg.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:sqlserver://localhost;databaseName=RXP</property>
<property name="connection.username">user</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="tables.User"/>
</session-factory>
</hibernate-configuration>
そして私のセッションファクトリー:
public final class DaoSF implements Serializable {
private static final long serialVersionUID = 1L;
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
public static SessionFactory getSessionFactory() {
try {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
catch (HibernateException he) {
...
}
}
}