簡(jiǎn)述Hibernate映射XML文件
學(xué)習(xí)Hibernate時(shí),經(jīng)常會(huì)遇到Hibernate映射XML文件問(wèn)題,這里將介紹Hibernate映射XML文件問(wèn)題的解決方法。
在《Hibernate in Action》一書(shū)中,提到怎樣從實(shí)體Hibernate映射XML文件中加載,先來(lái)看下代碼:
- Configuration cfg = new Configuration();
- cfg.addResource("hello/Message.hbm.xml");
- cfg.setProperties( System.getProperties() );
- SessionFactory sessions = cfg.buildSessionFactory();
這段代碼清晰的說(shuō)明了從hello包里加載Message實(shí)體定義的過(guò)程。對(duì)于這個(gè)例子來(lái)說(shuō)還好,但對(duì)那些有多個(gè)實(shí)體的應(yīng)用來(lái)說(shuō),就很單一而且容易出錯(cuò)。不僅映射關(guān)系是硬編碼,還得手工管理每次添加一個(gè)新的實(shí)體就要更新實(shí)體加載的代碼。其實(shí)有跟簡(jiǎn)單的方法去查找和加載映射關(guān)系以使其與最新的jar文件保持一致。
首先,在你的web服務(wù)器或者企業(yè)服務(wù)器里,映射文件需要放置在類路徑里,這樣Hibernate才能正常的運(yùn)行。這樣做是很有好處的,因?yàn)槟闼枰龅木褪鞘褂猛瑯拥膉ar包和查找相應(yīng)的映射文件的名字。因?yàn)槟憧赡軙?huì)有多個(gè)jar文件在你的類路徑里,你需要指定哪個(gè)jar包包含了映射文件。
以下就是一種查找映射關(guān)系的方法:
- String cp = System.getProperty("java.class.path");
- String jarFile = null;
- List hbmList = null;
- String[] cpcparr = cp.split("\\:");
- for(int j=0;j<cparr.length;j++){
- // The following assumes our entities
- // are wrapped up in a jar file
- // called 'dbobjs.jar'
- if(cparr[j].indexOf("dbobjs.jar") != -1)
- jarFile=(cparr[j]);
- }
- if(jarFile != null){
- JarFile jar = new JarFile(new File(jarFile));
- Enumeration e = jar.entries();
- if(e.hasMoreElements()){
- hbmList = new ArrayList();
- while(e.hasMoreElements()){
- // Object comes back as JarFile$JarFileEntry
- JarEntry entry = (JarEntry)e.nextElement();
- if(entry.getName().indexOf(".hbm.xml") != -1){
- hbmList.add(entry.getName());
- }
- }
- }else {
- System.out.println("Error: The entity jar dbobjs.
jar was not found in " +"classpath: " + cp);- }
- }
上面的代碼主要完成了以下幾件事情:獲取Java虛擬機(jī)初始化的classpath系統(tǒng)屬性;查找含有實(shí)體映射文件的jar包;解析映射文件的名字,最后添加到一個(gè)ArrayList對(duì)象中去。
【編輯推薦】