Hibernate 3 Annotations进阶教程
2008-07-31 08:18
411 查看
Hibernate 3 Annotations进阶教程
来源:JAVA天堂J2EE
<script type="text/javascript"><!--
google_ad_client = "pub-9495000945733010";
/* 336x280, 创建于 08-3-9 */
google_ad_slot = "5629325625";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><iframe name="google_ads_frame" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9495000945733010&dt=1217463502640&lmt=1214976825&output=html&slotname=5629325625&correlator=1217463502640&url=http%3A%2F%2Fwww.javah.net%2FHibernate%2F20070415%2F198.html&ref=http%3A%2F%2Fblog.csdn.net%2Fzaowei21%2Farchive%2F2007%2F06%2F06%2F1640316.aspx&frm=0&cc=100&ga_vid=938614389277376100.1214469999&ga_sid=1217463453&ga_hid=1604638800&ga_fc=true&flash=9.0.124&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=1&u_java=true&u_nplug=14&u_nmime=55" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" width="336" frameborder="0" height="280"></iframe>
这些年来,Hibernate几乎已经成为java世界中数据库持久化方面事实上的标准,它强大灵活并且性能优秀.在这篇文章中,我们来看一下Java 5的注解功能怎么简单地用在你的hibernate代码中让你的持久化层变得更容易.
在
过去,Hibernate
依靠外部的XML文件来配置持久化对象,数据库映射文件定义在一组XML映射文件里并且在程序开始的时候被装载.有很多办法来创建这些映射文件,或者自动
从一个已存在的数据库模式里创建,或者手动从java类对象中创建.不管那种情况,你都得产生一大堆Hibernate
映射文件而结束工作.,你也可以利用外部工具从javadoc-style 的注解中生成映射文件,但这给你的开发流程增加了额外的负担.
在
最近的Hibernate版本里,一个新的建立在Java 5 注解之上更为优雅的方法出现了.利用新的Hibernate Annonations
库,你可以发布一次如你以前的映射文件所定义的信息,你猜到了-注解直接嵌入你的Java类文件里.注解带来了一种强大灵活地声明持久化映射的办法.在最
新版的几个Java集成开发环境里都很好的支持,并带有代码自动完成和语法高亮功能.
Hibernate annotations
也支持最新的EJB 3持久化规范,这些规范目的是提供一个标准的Java持久化机制.当然Hibernate
3也提供了更多的解决方案,你能非常容易的靠近保准并且利用EJB 3编程模型编写你的Hibernate持久化层.
现在让我们一步步了解Hibernate Annotations.
关键字:Hibernate Annotations
安装 Hibernate Annotations
为
了使用Hibernate Annotations,你需要最新的Hibernate 3.2 ,当然还有Java 5 你可以在Hibernate
web site 这个网站下载Hibernate 3.2和Hibernate Annotations库.除了标准的Hibernate
库文件和必须的依赖库之外,还需要下载 Hibernate Annotations库和Java 持久化API
---ejb3-persstence.jar文件.如果你正在使用Maven,仅仅添加相应的依赖到你的DOM文件里,如下所示:
... <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.2.1.ga</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.2.0.ga</version> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency> ...
下 一步是获得一个Hibernate Session 工厂.利用Hibernate
Annotations与不使用它创建Hibernate
session工厂有一点不同,虽然不需要大幅度修改.你只需须简单地使用AnnotationConfiguration类安装你的session工
厂:
sessionFactory =new AnnotationConfiguration().buildSessionFactory();
一般的,你需要通过<mapping>元素在Hibernate配置文件里(hibernate.cfg.xml)声明持久化类
<hibernate-configuration> <session-factory> <mapping class="com.onjava.modelplanes.domain.PlaneType"/> <mapping class="com.onjava.modelplanes.domain.ModelPlane"/> </session-factory> </hibernate-configuration>
如今许多java 工程都使用轻量级的程序框架例如Spring.如果你正在用Spring框架,你可以容易地利用AnnotationSessionFactory类装配一个基于Annotations 的Hibernate Session Factory,如下:
<!-- Hibernate session factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> ... </props> </property> <property name="annotatedClasses"> <list> <value>com.onjava.modelplanes.domain.PlaneType</value> <value>com.onjava.modelplanes.domain.ModelPlane</value> ... </list> </property> </bean>
我们第一个持久化类
现在我们知道如何获得基于Annotation的Hibernate Session ,让我们看看这个注解的持久化类看起来像什么样子.
被
注解的持久化类是一般的POJO类,就像在其他Hibernate程序里的一样.好的,差不多了.你需要依赖于Java 持久化API
(javax.persistence.*),并且还需要导入注解包类(org.hibernate.annotations.*)如果你使用了任何
Hibernate扩展的话.但是除此之外,他们仅仅是拥有持久化相关注解的POJO.这有个例子:
@Entity public class ModelPlane { private Long id; private String name; @Id 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; } }
如
我们所言,非常简单.@Entity注解声明类将被持久化.@Id注解让你指示持久化类的唯一性标识属性.实际上,你可以持久化字段(注解成员变量)或者
持久化属性(通过注释getter方法.在这篇文章的剩余部分,我们将用基于属性的注解.关于基于注解的持久化一个好处是他的缺省行为.例如.你不需要声
明每一个属性是否要被持久化-任何属性都假定将被持久化除非用@Transient注解了他.
对代码来说这是简单的,并且相对于旧的XML配置文件来说,也节省了很多打字量.
生成主键
Hibernate一个擅长的功能是主键自动生成,Hibernate/EJB 3注解也为主键自动生成提供了丰富的支持,允许诸多生成策略.下面例子演示了最常见的用途,这里Hibernate 根据数据库给出一个合适的主键生成策略.
@Id @GeneratedValue (strategy=GenerationType.AUTO) public Long getId() { return id; }
自定义表和字段映射
默认情况下,Hibernate将映射持久化类到表,用匹配的字段名映射.例如,上面的类将经由下列SQL语句映射到表:
CREATE TABLE MODELPLANE ( ID long, NAME varchar )
如果你自己生成和维护数据库的话非常好,并且使你的代码易于维护.然而,他不适
a06f
合所有需求.有些程序需要访问外部数据库,并且可能需要公司数据库命名转换.如果需要的话,你可以使用@Table和@Column注解进行你的持久化映射:
@Entity @Table(name="T_MODEL_PLANE") public class ModelPlane { private Long id; private String name; @Id @Column(name="PLANE_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="PLANE_NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } }
它将映射到下面的表
CREATE TABLE T_MODEL_PLANE ( PLANE_ID long, PLANE_NAME varchar )
你可以利用Table和Column属性自定义映射.它可让你指定诸如列长度,not-null约束等等,hibernate支持大量的属性注解:
... @Column(name="PLANE_ID", length=80, nullable=true) public String getName() { return name; } …
映射关系
Java持久化映射中一个最重要,最复杂的部分是确定怎么映射表间的关系.如其他的特性一样,Hibernate在这方面也提供了大量的灵活性,但是以增加了某种复杂度为代价的.我们将浏览一系列共同的用例以对如何使用注解有个大体认识.
最
常用的一个关系是many-to-one关系.假定在上面的例子中,每个ModelPlane经由many-to-one关系被关联到一个
PlaneType (换句话说每个Model plane 被确切的关联到一个 plane type,通过给定一个plane
type可以被关联到多个 model plane ),你可以映射如下:
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) public PlaneType getPlaneType() { return planeType; }
这个CascadeType值表示Hibernate将怎么进行级联操作
另
外一个常用的关系是与上面相对的:one-to-many关系,也以集合而闻名,集合将映射变得有些复杂,在旧的和新的注解中,并且我们将撇开表面细节直
接给你完成的例子以给你一个大概,例如在上面例子中,每一个PlaneType对象可能包含一个ModelPlane的集合,可以映射如下:
@OneToMany(mappedBy="planeType", cascade=CascadeType.ALL, fetch=FetchType.EAGER) @OrderBy("name") public List<ModelPlane> getModelPlanes() { return modelPlanes; }
命名查询
Hibernate一个优秀的特征是可以在映射文件申明命名查询的能力.这些查询可以通过名字在代码里调用,这可以让你集中查询且避免有sql或者Hql代码分散在程序里.
你也可以通过注解,利用@NameQueries和@NameQuery注解,如下:
@NamedQueries( { @NamedQuery( name="planeType.findById", query="select p from PlaneType p left join fetch p.modelPlanes where id=:id" ), @NamedQuery( name="planeType.findAll", query="select p from PlaneType p" ), @NamedQuery( name="planeType.delete", query="delete from PlaneType where id=:id" ) } )
一旦定义,可以可以调用正如其他命名查询.
总结
Hibernate
3注解提供了一个强大而优雅的API来简化java数据库持久化代码,在这里我们仅仅涉及到表面的知识,你选择贴近标准,并且利用java持久化API或
者收益于Hibernate的规范扩展,
在以失去某种轻便性为代价的基础上,它提供了更为强大灵活的功能.不管怎么样,通过避免了xml映射文件.使用Hibernate注解可以简化你的程序维
护,另外的好处是指给你一个走进EJB 3大门的幽径.
相关文章推荐
- Hibernate 3 Annotations进阶教程
- [转]Hibernate 3 Annotations 进阶
- 转贴:Hibernate 3 Annotations 进阶,不错,发扬一下
- Hibernate 3 Annotations 进阶
- [转]Hibernate 3 Annotations 进阶
- Hibernate 3 Annotations 进阶
- Hibernate添加 annotation注解实体【AddHibernate mapping annotations to POJO 灰色点不了】
- Hibernate3官方教程-第1章-第3部分
- Zend Studio 6 + Zend Framework进阶教程之二
- Hibernate进阶一级缓存
- Hibernate进阶
- Android高手进阶教程(十二)之----Android 在一个应用中如何启动另外一个已安装的应用!!!
- hibernate进阶---多对多映射
- 大数据零基础学习全套教程(同样适合有一定基础想进阶的)
- Android高手进阶教程(九)之----Android Handler的使用!!!
- Hibernate遇到Caused by: java.lang.NoSuchMethodError: org.hibernate.annotations.common.util.impl.L
- [原创]Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- hibernate-tools详细使用教程
- Hibernate+Junit-史上最详细图解教程-从环境配置到入门
- J2EE进阶(九)org.hibernate.LazyInitializationException: could not initialize proxy - no Session