簡述Hibernate映射XML文件
學習Hibernate時,經(jīng)常會遇到Hibernate映射XML文件問題,這里將介紹Hibernate映射XML文件問題的解決方法。
在《Hibernate in Action》一書中,提到怎樣從實體Hibernate映射XML文件中加載,先來看下代碼:
- Configuration cfg = new Configuration();
- cfg.addResource("hello/Message.hbm.xml");
- cfg.setProperties( System.getProperties() );
- SessionFactory sessions = cfg.buildSessionFactory();
這段代碼清晰的說明了從hello包里加載Message實體定義的過程。對于這個例子來說還好,但對那些有多個實體的應(yīng)用來說,就很單一而且容易出錯。不僅映射關(guān)系是硬編碼,還得手工管理每次添加一個新的實體就要更新實體加載的代碼。其實有跟簡單的方法去查找和加載映射關(guān)系以使其與最新的jar文件保持一致。
首先,在你的web服務(wù)器或者企業(yè)服務(wù)器里,映射文件需要放置在類路徑里,這樣Hibernate才能正常的運行。這樣做是很有好處的,因為你所需要做的就是使用同樣的jar包和查找相應(yīng)的映射文件的名字。因為你可能會有多個jar文件在你的類路徑里,你需要指定哪個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虛擬機初始化的classpath系統(tǒng)屬性;查找含有實體映射文件的jar包;解析映射文件的名字,最后添加到一個ArrayList對象中去。
【編輯推薦】