【问题标题】:Why does hibernate not find properties when I have hibernate.cfg.xml in my default package classpath?为什么当我的默认包类路径中有 hibernate.cfg.xml 时,hibernate 找不到属性?
【发布时间】:2009-09-08 15:00:12
【问题描述】:

让这个简单的应用程序运行起来我很费时间。我的默认类路径中有一个配置文件,在配置文件中使用带有正确类条目的注释,以及由 hibernate eclipse 插件工具生成的默认 Session 工厂类。如果我只依赖默认的类路径配置文件,我会得到一个 hibernate.properties 未找到。如果我在应用程序生命周期的早期添加另一个调用来设置工厂对象的文件路径,我会收到重复的类/实体映射错误。为什么找不到属性,或者为什么即使配置文件在类路径上也会看到该错误?动态设置配置文件的文件路径的正确方法是什么,这样我就不必依赖应用程序类路径中内置的配置文件?

【问题讨论】:

  • 作为对此的跟进,似乎hibernate最初在应用程序启动时配置自己,可能与我想象的不同 SessionFactory 类。你怎么知道 hibernate 将使用哪个类作为默认的 SessionFactory?是否有一些配置属性应该指向这个类以便它使用它?我在任何地方都没有看到

标签: hibernate configuration annotations


【解决方案1】:

谢谢安德烈,我获得了更多的见解,并且基本上解决了我最初的问题。

基本上,我决定摆脱生成的 SessionFactory 类,而只使用常规的 SessionFactory。我遇到的问题是由于每次引用工厂类时都会调用静态初始化,基本上,当我认为只有一个会话时,我的应用程序有两个会话。现在,至于配置,我阅读了概念文档的配置章节中的第 3.7 节,它误导性地表明您可以传递,或者至少我解释为“路径”到另一个文件,如下所示:

SessionFactory sf = new AnnotationConfiguration().configure("what/i/though/was/path/to/file").buildSessionFactory();

但事实证明它会在同一个地方寻找配置文件的“名称”:默认的类路径包。那时,我决定从指定名称的普通旧 java 属性中加载一个属性,并将所有命名文件保留在类路径中。通过这种方式,我可以为正确的环境加载正确的文件。现在,如果我能通过这个部署,唯一的问题是:

Sep 14 05:25:53 localhost.localdomain (SessionFactoryObjectFactory.java:82) INFO org.hibernate.impl.SessionFactoryObjectFactory - 未将工厂绑定到 JNDI,未配置 JNDI 名称

他们肯定不会让它易于使用...;-) 再次感谢,我非常感谢您的回复。

【讨论】:

    【解决方案2】:

    这并不是真正的答案,只是进一步的观察,不适合评论:

    作为另一个后续行动,为了帮助任何可能的救援人员,我现在正在部分完成应用程序运行期间的配置和初始化过程。现在,我的默认类路径中有 hibernate.cfg.xml。如果我只是使用它运行,我会收到未找到属性的错误。如果我添加对会话工厂类 ...setFilePath(pathToConfigFileAsString) 方法的调用,我会得到两个不同的结果,具体取决于这是干净构建的第一次运行,还是后续运行。在第一次运行。我们现在在特定类的 AnnotationsConfiguration 期间死亡,而不是输出说明原因或任何内容。在随后的运行中,我们将一直运行到 DEBUG org.hibernate.cfg.AnnotationBinder - 处理注释然后就死了,也没有帮助调试正在发生的事情。为什么根据应用程序之前是否运行过会有两种不同的结果?

    【讨论】:

    • 您应该编辑您的问题以包含此内容,而不是发布答案。
    【解决方案3】:

    坦率地说,我不知道你的 Eclipse 生成的 SessionFactory 代码在做什么,但如果你的 hibernate.cfg.xml 真的在你的根 src 文件夹中,那么这应该会成功地为你创建一个 SessionFactory

    SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
    

    configure() 方法可以接受一个参数来指示使用哪个配置文件。如果省略,则隐含“根 src 文件夹”hibernate.cfg.xml

    也许使用它可以为我们提供有关该问题的更多信息。

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      相关资源
      最近更新 更多