javascript

位置:IT落伍者 >> javascript >> 浏览文章

在JSE环境使用Hibernate EntityManger


发布日期:2024年03月02日
 
在JSE环境使用Hibernate EntityManger

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());//() 看下面解释

}

publicProperties 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

               

上一篇:基于Facelets的JSF

下一篇:JSF和Struts的区别概述