大家都知道在ejb3中 使用entitymanger来操作持久化数据,hibernate也实现了与ejb3完全兼容并且功能更强的entitymanger,配合hibernate annotation一起使用 可以说在数据持久化方面与ejb3几乎没有区别了,技术最终汇聚到了一起.可见现在技术发展的趋势.
版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:icess(作者的blog:http://blog.matrix.org.cn/page/icess)
原文:hibernate+entitymanger.html
" target="_new">http://www.matrix.org.cn/resource/article/44/44202_hibernate+entitymanger.html
关键字:hibernate;entitymanager
jboss的ejb3实现中,就使用hibernate entitymanager 和annotations 作为数据持久化机制,本文不准备讨论如何在jboss中使用hibernate entitymanager 我们在本文中看看如何在jse环境中使用entitymanger, 这样当你的项目需要扩展到jee容器中时,同样的entitymanger升级是很简单的. ok,下面我们看看如何在jse环境中应用entitymanager吧:
环境配置:
jdk : v5.0 or 更新
hibernate core : v3.1.1 or 更新(要包涵hibernate core所需要的jar库)
hibernate annotation: v3.1beta8
hibernate entitymanger: v3.1beta6
下面看两个相关的定义
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容器中使用,这就是ejb3 的持久化实现机制.
下面我通过一个来自entitymanger test suit中的修改版的简单示例来演示一些如何在jse环境中配置和操作持久化实体.
下面是一个利用hibernate annotation注释的持久化实体:
/*
* created on 2006-2-5
* @author icerain
*/
package test.test;
import java.io.serializable;
import java.util.hashset;
import java.util.set;
import javax.persistence.column;
import javax.persistence.entity;
import javax.persistence.entityresult;
import javax.persistence.fieldresult;
import javax.persistence.id;
import javax.persistence..netomany;
import javax.persistence.sqlresultsetmapping;
@entity(name = "item")
// @sqlresultsetmapping(name = "getitem", entities =
// @entityresult(name = "org.hibernate.ejb.test.item", 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<distributor> distributors;
public item() {
}
public item(string name, string desc) {
this.name = name;
this.descr = desc;
}
@column(length = 200)
public string getdescr() {
return descr;
}
public void setdescr(string desc) {
this.descr = desc;
}
@id
@column(length = 30)
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
// @.netomany
// public set<distributor> getdistributors() {
// return distributors;
// }
//
// public void setdistributors(set<distributor> distributors) {
// this.distributors = distributors;
// }
//
// public void adddistributor(distributor d) {
// if ( distributors == null ) distributors = new hashset();
// distributors.add( d );
// }
}
/*
* created on 2006-2-5
* @author icerain
*/
package test.test;
import java.io.ioexception;
import java.io.inputstream;
import java.util.arraylist;
import java.util.map;
import java.util.properties;
import javax.persistence.entitymanager;
import javax.persistence.entitymanagerfactory;
import javax.persistence.persistence;
import org.hibernate.cfg.environment;
import org.hibernate.ejb.ejb3configuration;
import org.hibernate.ejb.hibernatepersistence;
public class testconfig {
private entitymanagerfactory emf = null;
public testconfig() {
this(null);
}
public testconfig(string filename) {
// 利用ejb3configuration来建立entitymanagerfactory
emf = new ejb3configuration().addannotatedclass(item.class).createentitymanagerfactory(); //(1) 看下面解释
//emf = persistence.createentitymanagerfactory("manager1"); // 在jse环境中不可以使用??? (2) 看下面解释
system.out.println("create emf:::::");
// 利用hibernatepersistence来建立entitymanagerfactory
//emf = new hibernatepersistence().createentitymanagerfactory(getconfig()); //(3) 看下面解释
}
public properties loadproperties() {
properties props = new properties();
inputstream stream = persistence.class.getresourceasstream( "/hibernate.properties" );
if ( stream != null ) {
try {
props.load( stream );
}
catch (exception e) {
throw new runtimeexception( "could not load hibernate.properties" );
}
finally {
try {
stream.close();
}
catch (ioexception ioe) {
}
}
}
props.setproperty( environment.hbm2ddl_auto, "create-drop" );
return props;
}
private map getconfig() {
map config = loadproperties();
arraylist<class> classes = new arraylist<class>();
classes.add(item.class);
config.put( hibernatepersistence.loaded_classes, classes );
return config;
}
public void testentitymanager() { // 测试持久化数据操作 (4)
item item = new item( "mouse1", "micro$oft mouse" );
entitymanager em = emf.createentitymanager();
em.gettransaction().begin();
em.persist( item );
system.out.println( em.contains( item ) );
em.gettransaction().commit();
system.out.println(em.contains(item));
em.gettransaction().begin();
item = (item) em.createquery( "from item where descr like 'm%'" ).getsingleresult();
system.out.println(item.getdescr() + ":" + item.getname());
item.setdescr( "micro$oft wireless mouse" );
em.gettransaction().commit();
system.out.println(item.getdescr() + ":" + item.getname());
em.close();
closeemf();
}
public void closeemf() {
emf.close();
system.out.println("emf is closed..");
}
/**
* @param args
*/
public static void main(string[] args) {
// todo auto-generated method stub
new testconfig().testentitymanager();
}
}
#created by jinto - www.guh-software.de
#sun feb 05 22:38:30 cst 2006
hibernate.cache.provider_class=org.hibernate.cache.hashtablecacheprovider
hibernate.cache.region_prefix=hibernate.test
hibernate.connection.driver_class=com.mysql.jdbc.driver
hibernate.connection.password=329
hibernate.connection.pool_size=1
hibernate.connection.url=jdbc\:mysql\://localhost/test3
hibernate.connection.username=root
hibernate.default_batch_fetch_size=8
hibernate.dialect=org.hibernate.dialect.mysqldialect
hibernate.hbm2ddl.auto=update
hibernate.jdbc.batch_versioned_data=true
hibernate.jdbc.use_streams_for_binary=true
hibernate.max_fetch_depth=1
hibernate.order_updates=true
hibernate.proxool.pool_alias=pool1
hibernate.query.substitutions=true 1, false 0, yes 'y', no 'n'
javax.persistence.provider=org.hibernate.ejb.hibernatepersistence
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器