熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

在JSE環境使用Hibernate EntityManger

2013-11-23 20:19:28  來源: Java開源技術 

  JBoss的EJB實現中就使用Hibernate EntityManager 和Annotations 作為數據持久化機制本文不准備討論如何在JBoss中使用Hibernate EntityManager 我們在本文中看看如何在JSE環境中使用EntityManger 這樣當你的項目需要擴展到JEE容器中時同樣的EntityManger升級是很簡單的 OK下面我們看看如何在JSE環境中應用EntityManager吧:

環境配置:

JDK : v or 更新
Hibernate core : v or 更新(要包涵Hibernate Core所需要的Jar庫)
Hibernate Annotation: vbeta
Hibernate EntityManger: vbeta

下面看兩個相關的定義

EntityManagerFactory

  EntityManagerFactory 提供 Entity manager的實例(instances:所有被配置的實例都連接相同的數據庫)利用相同的默認設置你可以准備幾個EntityManagerFactory 來訪問不同的數據庫該接口(interface)和Hibernate core中的SessionFactory差不多

EntityManager

  EntityManager API 是用來在一個特別的工作單元(particular unit of work)中訪問數據庫的她用來創建和刪除(create and remove) 持久實體實例的;可以通過實體的主鍵標識符(primary key identity)來查詢(find)實體;或者查詢所有實體 這個接口和Hibernate core中的Session差不多
因此使用Hibernate EntityManager 和使用Hibernate Core 是差不多的只不過 EntityManger還可以方便的在JEE容器中使用這就是EJB 的持久化實現機制
下面我通過一個來自EntityManger test suit中的修改版的簡單示例來演示一些如何在JSE環境中配置和操作持久化實體

下面是一個利用Hibernate Annotation注釋的持久化實體:

  /*
* Created on
* @author icerain
*/
package testtest;

import javaioSerializable;
import javautilHashSet;
import javautilSet;
import javaxpersistenceColumn;
import javaxpersistenceEntity;
import javaxpersistenceEntityResult;
import javaxpersistenceFieldResult;
import javaxpersistenceId;
import javaxpersistenceOneToMany;
import javaxpersistenceSqlResultSetMapping;

@Entity(name = Item)
//    @SqlResultSetMapping(name = getItem entities =
//    @EntityResult(name = orghibernateejbtestItem fields = {
//    @FieldResult(name = name column = itemname)
//    @FieldResult(name = descr column = itemdescription)
//    })
//)
//@Cache(region=Item usage=NONSTRICT_READ_WRITE)
public class Item implements Serializable {

  private String name;
  private String descr;
  //private Set distributors;

  public Item() {
  }

  public Item(String name String desc) {
    thisname = name;
    thisdescr = desc;
  }

  @Column(length = )
  public String getDescr() {
    return descr;
  }

  public void setDescr(String desc) {
    thisdescr = desc;
  }

  @Id
  @Column(length = )
  public String getName() {
    return name;
  }

  public void setName(String name) {
    thisname = name;
  }

//  @OneToMany
//  public Set getDistributors() {
//    return distributors;
//  }
//
//  public void setDistributors(Set distributors) {
//    thisdistributors = distributors;
//  }
//
//  public void addDistributor(Distributor d) {
//    if ( distributors == null ) distributors = new HashSet();
//    distributorsadd( d );
//  }
}

  下面是測試和配置的代碼:

  /*
* Created on
* @author icerain
*/
package testtest;

import javaioIOException;
import javaioInputStream;
import javautilArrayList;
import javautilMap;
import javautilProperties;

import javaxpersistenceEntityManager;
import javaxpersistenceEntityManagerFactory;
import javaxpersistencePersistence;

import orghibernatecfgEnvironment;
import orghibernateejbEjbConfiguration;
import orghibernateejbHibernatePersistence;


public class TestConfig {
  private EntityManagerFactory emf = null;

  public TestConfig() {
    this(null);
  }
  public TestConfig(String fileName) {
    // 利用EjbConfiguration來建立EntityManagerFactory
    emf = new EjbConfiguration()addAnnotatedClass(Itemclass)createEntityManagerFactory();  //() 看下面解釋
    //emf = PersistencecreateEntityManagerFactory(manager); // 在JSE環境中不可以使用??? () 看下面解釋
    Systemoutprintln(Create EMF:::::);
  // 利用HibernatePersistence來建立EntityManagerFactory
    //emf = new HibernatePersistence()createEntityManagerFactory(getConfig());  //() 看下面解釋
  }
  
  public  Properties loadProperties() {
    Properties props = new Properties();
    InputStream stream = PersistenceclassgetResourceAsStream( /hibernateproperties );
    if ( stream != null ) {
      try {
        propsload( stream );
      }
      catch (Exception e) {
        throw new RuntimeException( could not load hibernateproperties );
      }
      finally {
        try {
          streamclose();
        }
        catch (IOException ioe) {
        }
      }
    }
    propssetProperty( EnvironmentHBMDDL_AUTO createdrop );
    return props;
  }

  private Map getConfig() {
    Map config = loadProperties();
    ArrayList classes = new ArrayList();

    classesadd(Itemclass);
    configput( HibernatePersistenceLOADED_CLASSES classes );
    
    return config;
  }
  
  public void testEntityManager() { // 測試持久化數據操作 ()

    Item item = new Item( Mouse Micro$oft mouse );

    EntityManager em = emfcreateEntityManager();
    emgetTransaction()begin();
    empersist( item );
    Systemoutprintln( ntains( item ) );
    emgetTransaction(mit();

    Systemoutprintln(ntains(item));

    emgetTransaction()begin();
    item = (Item) emcreateQuery( from Item where descr like M% )getSingleResult();
    
    Systemoutprintln(itemgetDescr() + : + itemgetName());
    
    itemsetDescr( Micro$oft wireless mouse );
    emgetTransaction(mit();
    
    Systemoutprintln(itemgetDescr() + : + itemgetName());

    emclose();
    closeEMF();

  }
  
  public void closeEMF() {
    emfclose();
    Systemoutprintln(EMF is closed);
  }

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Autogenerated method stub
    new TestConfig()testEntityManager();
  }

}

  上面就是測試代碼可以看到我們可以用不同的方法來創建 EntityManagerFactory  之所以有這麼多方法是為了在不同的環境中使用的

(): 利用EjbConfiguration來建立EntityManagerFactory 她會在工程目錄下尋找hibernateproperties 配置文件(hibernatecfgxml好像不可以大家可以試試看)然後根據配置信息來創建EntityManagerFactory
配置文件如下:

  #Created by JInto wwwguhsoftwarede
#Sun Feb :: CST
hibernatecacheprovider_class=orghibernatecacheHashtableCacheProvider
hibernatecacheregion_prefix=hibernatetest
nnectiondriver_class=commysqljdbcDriver
nnectionpassword=
nnectionpool_size=
nnectionurl=jdbc\:mysql\://localhost/test
nnectionusername=root
hibernatedefault_batch_fetch_size=
hibernatedialect=orghibernatedialectMySQLDialect
hibernatehbmddlauto=update
hibernatejdbcbatch_versioned_data=true
hibernatejdbcuse_streams_for_binary=true
hibernatemax_fetch_depth=
hibernateorder_updates=true
hibernateproxoolpool_alias=pool
hibernatequerysubstitutions=true false yes Y no N
javaxpersistenceprovider=orghibernateejbHibernatePersistence

()文檔上說利用Persistence可以創建的 但是我利用不同方法試了幾下都不可以大家可以試試 如果你知道如何用 要記得告訴我哦 :)

() 利用HibernatePersistence來建立EntityManagerFactory 她可以利用一個properties 來創建 該properties 你可以隨便創建 只有包含必要的配置信息就可以了 上面的代碼中用了一個Map

():  調用testEntityManager() 方法 測試持久化數據操作

ok 到此一個簡單的在JSE環境中使用EntityManger的介紹就結束了

後記:
  在JSE環境中使用 Hibernate Core 和EntityManager 是差不多的 有沒有必要使用EntityManager個人認為 使用EntityManager就是為了應付將來項目擴展的JEE容器中使用這樣持久化部分實現很容易在JEE容器中實現只要利用JNDI得到EntityManagerFactory就可以了別的就沒有什麼改動了如果你的項目不在JEE中使用的話 沒有必要用EntityManager


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28309.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.