我试图在我的应用程序中配置一个没有任何配置文件的嵌入式tomcat实例。
我做了一些研究,并根据这个长教程和短一点的提取了以下步骤:
ServletContextListener
@WebListener // web上的一些文章提到,这将自动地将//侦听器添加到应用程序上下文中,但我不能相信在我的示例中,公共类HibernateListener实现了ServletContextListener { public void contextInitialized(ServletContextEvent event) { HibernateUtil.getSessionFactory();//创建一个工厂} public void contextDestroyed(ServletContextEvent事件){ HibernateUtil.getSessionFactory().close();// free resources }HibernateUtil类
公共类HibernateUtil {私有静态最终SessionFactory sessionFactory;静态{ try {//应该在这里调用返回的配置的.configure()吗?sessionFactory = getConfiguration() .buildSessionFactory();} catch (Throwable ex) {System.err.println(“初始SessionFactory创建失败。”+ ex);抛出新的ExceptionInInitializerError(ex);}私有静态配置getConfiguration(){配置c=新配置();c.setProperty("hibernate.connection.username",(“hibernate.connection.url”,“jdbc:hsqldb:hsql://localhost:1234/mydb1 1”);c.setProperty("hibernate.connection.driver_class",“org.hsqldb.jdbcDriver”;c.setProperty(“方言”,"org.hibernate.dialect.HSQLDialect");c.setProperty("cache.provider_class","org.hibernate.cache.NoCacheProvider");c.setProperty("cache.use_query_cache","false");c.setProperty("cache.use_minimal_puts","false");c.setProperty("max_fetch_depth","3");c.setProperty("show_sql","true");c.setProperty("format_sql","true");c.setProperty("hbm2ddl.auto",“创建”);c.addPackage("com.example.models");c.addAnnotatedClass(MyClass.class);返回c;}公共静态SessionFactory getSessionFactory() {返回sessionFactory;}}MyClass通过hibernate从链接数据库中创建和检索数据,对吗?(现在我还不确定,究竟是怎么回事,但这并不是重点。)但不幸的是,当我试图将侦听器添加到tomcat时,我得到了一个NullPointerException。
org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1278) at org.apache.catalina.core.ApplicationContextFacade.addListener(ApplicationContextFacade.java:649)上线程"main“java.lang.NullPointerException中的异常
指向rootCtx.getServletContext().addListener("com.example.listeners.HibernateListener");行的
编辑1
但是,如果我运行的是hibernate独立的(没有tomcat),那么它可以运行精细的。数据被保存时没有错误!
在HibernateUtil中
public static void main(String[] args) {
MyClass mycls = new MyClass();
mycls.setMyProperty("My Property");
Session session = getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(mycls);
transaction.commit();
}因此,我认为配置hibernate的方式很好。这个错误与监听器添加.
我在这里做错什么了?
发布于 2014-01-02 11:49:05
在深入研究Tomcat的源代码之后,我找到了一个可能的解决方案:
rootCtx.addApplicationListener(new ApplicationListener("com.example.listeners.HibernateListener", false));它能满足我的需要!
发布于 2014-01-02 00:04:57
我认为,在初始化之后,您已经错过了对配置c的cinfigure()方法的调用。
所以应该是这样的:
SessionFactory sessionFactory = getConfiguration().confgure().buildSessionFactory();或
c = getConfiguration();
sessionFactory = c.configure().buildSessionFactory();更新
为了在runtim添加完整的属性,您可以创建一个Prperties对象并使用该方法。
configuration.buildSettings(Properties props)我不确定,但使用这种方法,hibernate不查找类路径中的hibernate.cfg.xml或.properties可能是可行的。
更新
您还可以尝试在getConfiguration方法中调用您的getSessionFactory方法,而不是在HibernateUtil expliciteLy的静态初始化器中调用它。
public static getSessionFactory() {
Configuration c = getConfiguration();
sessionFactory = c.buildSessionFactory();
return sessionFactory;
}https://stackoverflow.com/questions/20872943
复制相似问题