hibernate多对多 在JSE环境使用Hibernate EntityManger
在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: v beta Hibernate EntityManger: v beta 下面看两个相关的定义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 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 OneToMany;import javax persistence SqlResultSetMapping;@Entity(name = Item )// @SqlResultSetMapping(name = getItem entities =// @EntityResult(name = 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 distributors; public Item() { } public Item(String name String desc) { this name = name; this descr = desc; } @Column(length = ) public String getDescr() { return descr; } public void setDescr(String desc) { this descr = desc; } @Id @Column(length = ) public String getName() { return name; } public void setName(String name) { this name = name; }// @OneToMany// public Set getDistributors() {// return distributors;// }//// public void setDistributors(Set distributors) {// this distributors = distributors;// }//// public void addDistributor(Distributor d) {// if ( distributors == null ) distributors = new HashSet();// distributors add( d );// }}
下面是测试和配置的代码:
/* * Created on * @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 hibernate cfg Environment;import hibernate ejb Ejb Configuration;import hibernate ejb HibernatePersistence;public class TestConfig { private EntityManagerFactory emf = null; public TestConfig() { this(null); } public TestConfig(String fileName) { // 利用Ejb Configuration来建立EntityManagerFactory emf = new Ejb Configuration() addAnnotatedClass(Item class) createEntityManagerFactory(); //( ) 看下面解释 //emf = Persistence createEntityManagerFactory( manager ); // 在JSE环境中不可以使用??? ( ) 看下面解释 System out println( Create EMF::::: ); // 利用HibernatePersistence来建立EntityManagerFactory //emf = new HibernatePersistence() createEntityManagerFactory(getConfig()); //( ) 看下面解释 } 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 HBM DDL_AUTO create drop ); return props; } private Map getConfig() { Map config = loadProperties(); ArrayList classes = new ArrayList (); classes add(Item class); config put( HibernatePersistence LOADED_CLASSES classes ); return config; } public void testEntityManager() { // 测试持久化数据操作 ( ) Item item = new Item( Mouse Micro$oft mouse ); EntityManager em = emf createEntityManager(); em getTransaction() begin(); em persist( item ); System out println( ntains( item ) ); em getTransaction(mit(); System out println(ntains(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(mit(); 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(); }} 上面就是测试代码 可以看到 我们可以用不同的方法来创建 EntityManagerFactory 之所以有这么多方法是为了在不同的环境中使用的 ( ): 利用Ejb Configuration来建立EntityManagerFactory 她会在工程目录下寻找hibernate properties 配置文件(hibernate cfg xml好像不可以 大家可以试试看) 然后根据配置信息来创建EntityManagerFactory 配置文件如下:

lishixinzhi/Article/program/Java/ky/201311/28309