首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用嵌入式tomcat 7编程配置hibernate

用嵌入式tomcat 7编程配置hibernate
EN

Stack Overflow用户
提问于 2014-01-01 20:31:00
回答 2查看 1.3K关注 0票数 4

我试图在我的应用程序中配置一个没有任何配置文件的嵌入式tomcat实例。

我做了一些研究,并根据这个长教程短一点的提取了以下步骤:

  1. 创建一个ServletContextListener @WebListener // web上的一些文章提到,这将自动地将//侦听器添加到应用程序上下文中,但我不能相信在我的示例中,公共类HibernateListener实现了ServletContextListener { public void contextInitialized(ServletContextEvent event) { HibernateUtil.getSessionFactory();//创建一个工厂} public void contextDestroyed(ServletContextEvent事件){ HibernateUtil.getSessionFactory().close();// free resources }
  2. 将侦听器添加到应用程序上下文中 上下文rootCtx.getServletContext().addListener("com.example.listeners.HibernateListener");rootCtx = tomcat.addContext("",base.getAbsolutePath());tomcat.start();tomcat.getServer().await();
  3. 用必要的配置实现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;}}
  4. 现在我应该以某种方式使用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

代码语言:javascript
复制
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的方式很好。这个错误与监听器添加.

我在这里做错什么了?

EN

回答 2

Stack Overflow用户

发布于 2014-01-02 11:49:05

在深入研究Tomcat的源代码之后,我找到了一个可能的解决方案:

代码语言:javascript
复制
rootCtx.addApplicationListener(new ApplicationListener("com.example.listeners.HibernateListener", false));

它能满足我的需要!

票数 4
EN

Stack Overflow用户

发布于 2014-01-02 00:04:57

我认为,在初始化之后,您已经错过了对配置c的cinfigure()方法的调用。

所以应该是这样的:

代码语言:javascript
复制
 SessionFactory sessionFactory =  getConfiguration().confgure().buildSessionFactory();

代码语言:javascript
复制
c = getConfiguration();
sessionFactory = c.configure().buildSessionFactory();

更新

为了在runtim添加完整的属性,您可以创建一个Prperties对象并使用该方法。

代码语言:javascript
复制
  configuration.buildSettings(Properties props)

我不确定,但使用这种方法,hibernate不查找类路径中的hibernate.cfg.xml或.properties可能是可行的。

更新

您还可以尝试在getConfiguration方法中调用您的getSessionFactory方法,而不是在HibernateUtil expliciteLy的静态初始化器中调用它。

代码语言:javascript
复制
public static getSessionFactory() {
    Configuration c = getConfiguration();
    sessionFactory = c.buildSessionFactory();
    return sessionFactory;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20872943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档