Java标准版的EJB Persistence(一下)


下面是另外一个POJO——Person,我们已经对它进行了批注,以便保持;

@Entity
public class Person {
private Long id;

private String name;

private Address address;

public Person() {
}

@Id
@GeneratedValue
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@ManyToOne
public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}
}

上面这段代码中重要的一部分是用于地址字段的@ManyToOne批注。@ManyToOne批注是用于描述实体之间关系的一系列批注之一;在本文里,它表示很多个人可能参考的是一个地址。这就要求参考与一个已经保持了的地址相对应。

Person person=new Person();

person.setName("John Doe");

person.setAddress(address);



em.merge(person);



Merge方法能够智能地处理交给它的实体。如果实体是非托管的,就保持它;否则它就会处理存在的差异,并根据需要对数据库进行更新。这用来处理正在被保持的Person。

这就是保持的基础概念。当然这要排除我们假设已经存在的EntityManagerFactory。这就是轮子碰到马路的情形。下面就是创建它的一个典型调用。

EntityManagerFactory emf=Persistence.createEntityManagerFactory("example");

我们要Persistence层根据“example”这个名字创建一个工厂。用来创建这个工厂的配置信息来自一个叫做persistence.xml的文件,这个文件应该在你源码树的META-INF目录下。它定义了一个带有名字的“persistence-unit”,它有应该如何管理persisitence的细节,底层的哪个persistence提供程序将完成这项任务,以及要用到哪个数据库。下面就是这个代码段:

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence">

<persistence-unit name="example">

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<class>quick.Person</class>

<class>quick.Address</class>


<properties>…</properties>

</persistence-unit>

</persistence>

这里,我们有一个名为“example”的persistence-unit,我们把这个名字交给createEntityManagerFactory()。我们联合使用Hibernate的Annotations和EntityManager,因此<provider>元素指向HibernatePersistence提供程序。

你可以有一个或者多个<class>元素,每一个都指向一个你想要保持的类。在这个例子里,你可以看到用于Person和Address的类元素。这里还有一个<properties>元素,它包含有用于设置实现具体值的<property>元素,这些值会被传递用来创建EntityManagerFactory。

在我们的例子里,我们使用Hibernate和嵌入的HSQLDB。我们需要设置JDBC驱动器来使用URL,以连接到数据库并告诉Hibernate要使用什么样的SQL语句:

<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>

<property name="hibernate.connection.url" value="jdbc:hsqldb:data/example"/>

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

嵌入的HSQLDB要用“sa”用户名和空白密码才能启动。我们还想要限制hibernate取得相关对象的程度。

<property name="hibernate.connection.username" value="sa"/>

<property name="hibernate.connection.password" value=""/>

<property name="hibernate.max_fetch_depth" value="3"/>

最后是hbm2ddl.auto属性。这用来控制Hibernate在SQL数据库里动态地创建所需表格的能力。如果被设置为“创建(create)”,它就会在每次运行的时候清除数据库并建立新的表格。如果设置为“更新(update)”,它就会尝试修改原有表格以适合当前版本的实体;

<property name="hibernate.hbm2ddl.auto" value="create"/>

生成DDL来创建数据库是大多数实现里应该都有的东西,但是是否开启了这一功能就要看各个实现的具体情况了。

有了这个XML文件,你现在就有了足够的信息供createEntityManagerFactory创建简单的数据库。你会在本文附带的源代码里发现这个persistence.xml和示例代码。要让它运行起来,你就需要正确的库。首先,你需要从Hibernate的web网站获得HSQLDB数据库、

Hibernate、Hibernate-Annotations以及Hibernate-EntityManager。查看一下自述文件,看看你所需要的库可以从哪里获得。一旦让示例代码运行起来了,你就可以开始试验创建和保持一个简单的实体。如果想要看给persistence.xml属性加入SQL之后到底什么被执行,就要运行下面的代码;

<property name="hibernate.show_sql" value="true"/>

那么Hibernate将在执行每个SQL语句的时候进行转储。

现在,我们已经知道了保持的基本概念和一些简单的映射。以后,我们将再看一些可用的批注,以及如何保持集合然后研究一下Glassfish里面的参考EJB persistence实现。

 
 
 

雅虎收藏夹 百度收藏 Google书签 Yahoo书签 新浪ViVi 搜狐网摘 365Key网摘 天极网摘 diglog 和讯网摘 POCO网摘 YouNote网摘 博拉网 天下图摘 Del.icio.us digg reddit spurl BlinkList blogmarks
发表于: 2008-05-05,已浏览


相关文章