欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在Java SE中使用Hibernate框架
在Java SE中使用Hibernate框架
  目前人們很容易發(fā)現Hibernate正迅速的成為流行的J2EE的O/R映射工具和數據集成框架(如果不是最流行的)。Hibernate為企業(yè)應用開(kāi)發(fā)者操作關(guān)系數據庫的提供了清晰明了而又強大的工具。然而如果你需要在外部訪(fǎng)問(wèn)那些包裝在J2EE web應用里的實(shí)體,情況又怎樣呢?你的開(kāi)發(fā)跟應用獨立分開(kāi),卻又相同的實(shí)體以訪(fǎng)問(wèn)你的數據嗎?又或者你得編寫(xiě)附加的web組件來(lái)管理對數據的內部訪(fǎng)問(wèn)嗎?

  在很多情況下,這些問(wèn)題都會(huì )出現。我的情況是我的公司需要將來(lái)自多個(gè)供應商,有著(zhù)多種文件格式的記錄導入到數據庫里。我想起我以前經(jīng)常使用的方法,那就是編寫(xiě)Shell和SQL教本(甚至是存儲過(guò)程)來(lái)導入數據。但是由于我們的數據模型太過(guò)復雜,我決定在web應用之外盡可能的利用現有的實(shí)體,Spring DAO以及服務(wù)并且開(kāi)發(fā)一個(gè)自定義的J2SE命令行數據加載工具。

  大問(wèn)題:你該怎樣呢?

  現在很多Hibernate的文檔和范例都是綁定在容器上。不管是web應用還是內部的大型應用,總會(huì )使用到容器的。人們有很好的理由去使用它。容器是設計來(lái)提供對各種特性的支持,例如事務(wù)處理,線(xiàn)程以及安全?,F今,這些特性都是開(kāi)發(fā)中等規模和企業(yè)應用所必需的工具。然而當你需要在容器之外訪(fǎng)問(wèn)實(shí)體時(shí),你該怎樣呢?你是使用現有的架構和代碼呢,還是會(huì )從一個(gè)不同的角度來(lái)解決問(wèn)題,比如說(shuō)完全采用另一種開(kāi)發(fā)語(yǔ)言?當然,我們沒(méi)有正確答案。在本文的余下部分,我將說(shuō)明我的方法:就是在Spring容器之外重用現有的實(shí)體/POJO。

  起初,腳本語(yǔ)言,例如Perl,Python,Ruby甚至Tcl(是的,我以前也做過(guò)這個(gè))看起來(lái)有很多優(yōu)勢。它們能省下很多時(shí)間,可以輕易得到初始結果,還能規避許多Hibernate潛在的復雜度。人們完全可能只用幾行代碼就可以連接數據庫,查詢(xún)結果,已經(jīng)打印輸出到終端屏幕或者日志文件。然而,取決于你的數據模型,事情也(總是)會(huì )變得相當復雜。譬如說(shuō)你有一個(gè)表 person, 其中有一個(gè)外鍵屬于表 address。當我們添加數據的時(shí)候,表address沒(méi)有正確的插入數據,就會(huì )導致表person 也不能插入了。這是個(gè)很典型的事務(wù)處理方面的問(wèn)題。也許有人會(huì )說(shuō)在腳本語(yǔ)言中這個(gè)問(wèn)題不難解決,就像在你的主程序里一樣??墒菃?wèn)題仍然存在,為什么要這樣做呢?業(yè)務(wù)邏輯不是已經(jīng)在你的應用里面了嗎?為什么要在寫(xiě)一遍代碼呢?而且這并不是唯一的情況,你必須重復你的工作和業(yè)務(wù)邏輯,這樣就會(huì )帶來(lái)出錯的可能。

  然而,有些人會(huì )覺(jué)得這樣也行,他們使用自己覺(jué)得最適合的工具。也許你已經(jīng)因為程序之外的原因而有了某種獨立的架構;也許你會(huì )在獨立的數據庫里加載和測試數據,然后在通過(guò)各種測試后再遷移到產(chǎn)品的數據庫里;又也許你把數據庫維護外包出去,你只需要把相關(guān)文件發(fā)給合作伙伴讓他們去處理那些問(wèn)題??傊?,總會(huì )有很多理由不使用現有的Hibernate數據層。沒(méi)有誰(shuí)對誰(shuí)錯,只是如果你可以也愿意在你的應用之外使用現有的代碼,請往下看。我會(huì )告訴你一些方法,這能解決你不少的煩惱噢。

  配置

  如果你覺(jué)得可以在容器之外使用現有的Hibernate對象的話(huà),那你首先要做的事就是得自己手工管理所有的配置項,在本文余下部分我所采用的方法是使用一個(gè)基于命令行的JAVA程序。既然你已經(jīng)配置了Hibernate XML配置文件,你應該知道需要提供的參數,例如JNDI DataSource名,實(shí)體映射文件,還有其他一些處理SQL日志的屬性。如果你想使用命令行程序的話(huà),你就得解決如何解析XML文件和把它添加到配置項中的這些問(wèn)題。雖然解析XML文件也不難,但這本身并不是我們的重點(diǎn)。因此,我建議使用propetries文件,properties文件比較直觀(guān)而且容易加載并從中讀取數據。下面是配置Hibernate所需要的最小屬性集(不包括任何實(shí)體映射)。

  清單1:

hibernate.dialect=net.sf.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.url=jdbc:postgresql://devserver/devdb
hibernate.connection.username=dbuserhibernate.connection.password=dbpassword
hibernate.query.substitutions yes ‘Y‘

  正如你所看到的,上面的屬性值指定了數據庫方言,JDBC驅動(dòng),數據庫url,用戶(hù)名,用戶(hù)密碼,以及是否使用查找替換。只要定義以上幾項數值并保存在文件hibernate.properties里(要放置在你的類(lèi)路徑里面哦),就能很輕松的加載,填充到Hibernate Configuation類(lèi)里面。

  清單2:

Properties props = new Properties();
try {
 props.load(props.getClass().getResourceAsStream("hibernate.properties"));
}catch(Exception e){
 System.out.println("Error loading hibernate properties.");
 e.printStackTrace();
 System.exit(0);
}
String driver = props.getProperty("hibernate.connection.driver_class");
String connUrl = props.getProperty("hibernate.connection.url");
String username = props.getProperty("hibernate.connection.username");
String password = props.getProperty("hibernate.connection.password");
// In my examples, I use Postgres, but Hibernate
// supports virtually every popular dbms out
there.Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection(connUrl, username, password);
Configuration cfg = new Configuration();
cfg.setProperties( props );
SessionFactory sessions = cfg.buildSessionFactory();
Session session = sessions.openSession(conn);

  這樣我們就得到了Hibernate Session類(lèi)了。但我們也有必要解決如何利用現有的實(shí)體映射這個(gè)問(wèn)題。在《Hibernate in Action》一書(shū)中,提到怎樣從實(shí)體映射XML文件中加載,如下所示:

  清單3:

Configuration cfg = new Configuration();
cfg.addResource("hello/Message.hbm.xml");
cfg.setProperties( System.getProperties() );
SessionFactory sessions = cfg.buildSessionFactory();

  這段代碼清晰的說(shuō)明了從hello包里加載Message實(shí)體定義的過(guò)程。對于這個(gè)例子來(lái)說(shuō)還好,但對那些有多個(gè)實(shí)體的應用來(lái)說(shuō),就很單一而且容易出錯。不僅映射關(guān)系是硬編碼,還得手工管理每次添加一個(gè)新的實(shí)體就要更新實(shí)體加載的代碼。其實(shí)有跟簡(jiǎn)單的方法去查找和加載映射關(guān)系以使其與最新的jar文件保持一致。

  首先,在你的web服務(wù)器或者企業(yè)服務(wù)器里,映射文件需要放置在類(lèi)路徑里,這樣Hibernate才能正常的運行。這樣做是很有好處的,因為你所需要做的就是使用同樣的jar包和查找相應的映射文件的名字。因為你可能會(huì )有多個(gè)jar文件在你的類(lèi)路徑里,你需要指定哪個(gè)jar包包含了映射文件。以下就是一種查找映射關(guān)系的方法

  清單4:

String cp = System.getProperty("java.class.path");
String jarFile = null;
List hbmList = null;String[] cparr = 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系統屬性;查找含有實(shí)體映射文件的jar包;解析映射文件的名字,然后添加到一個(gè)ArrayList對象中去。當我們的ArrayList對象裝滿(mǎn)了實(shí)體映射的名字后,就可以將其傳遞到Hibernate Configuration 對象,如下所示:

  清單5:

Configuration cfg = new Configuration();
Iterator iterator = hbmFileNames.iterator();
while(iterator.hasNext()){
 cfg.addResource((String)iterator.next());
}

  只要我們在Hibernate Session 對象里配置好正確的映射關(guān)系,我們就可以將實(shí)體拿來(lái)使用了。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
更新JAR文件關(guān)聯(lián)
Android App 如何動(dòng)態(tài)加載類(lèi)
Hibernate緩存
SSH整合
JBPM4.4與SSH2的整合
Hibernate學(xué)習筆記1
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久