多休眠配置

问题描述:

我目前正在建立一个库来模块化我的一些代码,并且我遇到了Hibernate的一个问题。多休眠配置

在我的主应用程序中,我有一个hibernate配置来获取它需要运行的信息,但随后我也需要在我的库中使用hibernate,因为我想要的某些对象可以在其他应用程序中使用。

当我启动我的tomcat服务器,同时安装了两个hibernates,我得到错误,指出bean无法解析,并且一个说我的位置参数在我的查询中丢失。但是,当我只用应用程序Hibernate配置启动Tomcat时,它就可以正常启动。

下面介绍一下CONFIGS样子......

从库:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 


<session-factory> 
    <mapping resource="blah.hbm.xml"/> 
    <mapping resource="blargh.hbm.xml"/> 
    <mapping resource="stuff.hbm.xml"/> 
    <mapping resource="junk.hbm.xml"/> 
    <mapping resource="this.hbm.xml"/> 
</session-factory> 

</hibernate-configuration> 

并从应用程序:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 


<session-factory>  

    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

    <!-- Enable the query cache --> 
    <property name="hibernate.cache.use_query_cache">true</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">false</property> 

    <!-- mapping files --> 

    <mapping resource="appStuff"/> 
    <mapping resource="appBlah"/> 
    <mapping resource="appBlargh"/> 
    <mapping resource="appJunk"/> 
    <mapping resource="appThis"/>  

</session-factory> 

</hibernate-configuration> 

我还是很新的休眠,这是一种奇怪的配置。

您可以以编程方式加载hibernate配置文件。

SessionFactory sf = new Configuration().configure("somename.cfg.xml").buildSessionFactory(); 

这将允许您创建两个SessionFactory对象。不过,我假设你想为你的应用和你的模块使用相同的SessionFactory。

你可以同时加载hibernate的XML文件合并为一个DOM对象(与您的应用程序不耽误您的模块中的“会话工厂”的标签儿),然后使用下面的代码:

import org.hibernate.cfg.Configuration; 
// ... 
SessionFactory sf = new Configuration().configure(yourDOMObject).buildSessionFactory(); 

编辑:会话级工厂没有打印,因为它有大于和小于字符。

+0

这似乎是我正在寻找,但让我问这个。让我的图书馆拥有它可以使用的自己的会话工厂会更好吗?还是应该为整个事情建立一个会话工厂?就我的情况而言,似乎多个会议工厂会更合适,但我不知道如果我沿着这条路走下去会不会遇到麻烦。 – Shaded 2010-08-10 14:09:21

+0

说实话,我对Hibernate没有太多的经验。但是,根据您的描述,我认为多个SessionFactory对象似乎适合您的用例,因为它有助于模块化您的代码。但是不要听我说,因为我甚至不知道是否会对性能产生影响,或者有其他麻烦。 – 2010-08-10 14:53:46

+0

感谢您的帮助,我非常确定多种方式。我会用它跑,并希望它不会回来咬我! 再次感谢! – Shaded 2010-08-10 15:03:57

如果你想这样做,应该使用休眠碎片1。在hibernate.cfg.xml中的Othewise你可以简单的传递路径(在文件系统或类路径)要使用

从库

SessionFactory sf = new Configuration() 
    .configure("Fromthelibrary.cfg.xml") 
    .buildSessionFactory(); 

并从应用程序:

SessionFactory sf = new Configuration() 
     .configure("Fromtheapp.cfg.xml") 
     .buildSessionFactory();