2009-09-08 42 views
1

我有一个时间让这个简单的应用程序工作的婊子。我在默认的类路径中有一个配置文件,在配置文件中使用带有正确类条目的注释,以及由hibernate eclipse插件工具生成的默认Session工厂类。如果我只依赖默认的类路径配置文件,我会得到一个没有找到的hibernate.properties。如果我在应用程序生命周期中尽早添加另一个调用,以设置工厂对象的文件路径,则会出现重复的类/实体映射错误。为什么它找不到属性,或者即使配置文件位于类路径中,为什么会看到该错误?什么是动态设置文件路径到配置文件的正确方法,所以我不必依赖应用程序类路径中内置的配置文件?为什么在我的默认包类路径中有hibernate.cfg.xml时,hibernate没有找到属性?

+0

作为一个跟进,似乎hibernate最初是在应用程序启动时配置它自己,可能是一个不同的SessionFactory类,而不是我认为的那样。你如何知道Hibernate将使用哪个类作为默认的SessionFactory?有没有一些配置属性应该指向这个类,所以它使用它?我没有看到任何地方 – wkhatch 2009-09-08 17:33:04

回答

1

谢谢安德烈,我已经获得了更多的洞察力,基本上解决了我最初的问题。

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

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

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

9月14日05:25:53 localhost.localdomain(SessionFactoryObjectFactory.java:82)INFO org.hibernate.impl。SessionFactoryObjectFactory - 不绑定工厂到JNDI,没有配置JNDI名称

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

0

这是不是一个真正的答案,只是进一步的观测,将不适合评论:

另一个跟进,帮助任何会被救助者,我现在通过配置和初始化获取部分在应用程序运行过程中。我现在在我的默认类路径中有hibernate.cfg.xml。如果我只是运行这个,我得到属性找不到错误。如果我向会话工厂类... setFilePath(pathToConfigFileAsString)方法添加调用,则会得到两个不同的结果,具体取决于这是干净构建的第一次运行还是后续运行。第一次运行。我们现在在特定类的AnnotationsConfiguration期间死亡,而不是输出说明原因或任何事情。在后续运行中,我们将完成DEBUG org.hibernate.cfg.AnnotationBinder的所有操作 - 处理注释,然后死掉,对于发生的情况也没有任何帮助。为什么会根据应用程序是否已经运行而产生两种不同的结果?

+0

你应该编辑你的问题来包括这个,而不是发布一个答案。 – 2009-09-08 18:42:04

0

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

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

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

也许玩这个可以给我们更多关于这个问题的信息。

相关问题