I'm currently working on building a library to modularize some of my code and I'm running into a problem with Hibernate.
In my main application I have a hibernate config to get information it needs to run but then I also have a need for hibernate in my library since some of the objects I want could be used in other applications.
When I start up my tomcat server, with both hibernates setup, I get errors stating that beans cannot be开发者_如何学Go resolved and one that says my positional parameters are missing in my query. However, when I start up Tomcat with only the application Hibernate config it starts fine.
Here's what the configs look like...
From the library:
<?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>
And from the application:
<?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>
I'm still pretty new to Hibernate and this is sort of a weird configuration.
You can load hibernate configuration files programatically.
SessionFactory sf = new Configuration().configure("somename.cfg.xml").buildSessionFactory();
That would allow you to create two SessionFactory objects. However, I assume that you want to use the same SessionFactory for your app and your module.
You could load both hibernate XML files into a single DOM object (combine your module's "session-factory" tag children with your application's ones) and then use the following code:
import org.hibernate.cfg.Configuration;
// ...
SessionFactory sf = new Configuration().configure(yourDOMObject).buildSessionFactory();
Edit: session-factory wasn't printed because it had greater-than and less-than characters.
if you want to do it propely use hibernate shard 1. Othewise you can simply pass the path (on file system or in classpath ) of the hibernate.cfg.xml you want to use
From the library
SessionFactory sf = new Configuration()
.configure("Fromthelibrary.cfg.xml")
.buildSessionFactory();
And from the application:
SessionFactory sf = new Configuration()
.configure("Fromtheapp.cfg.xml")
.buildSessionFactory();
精彩评论