读书人

Hibernate 三注释简介

发布时间: 2012-08-22 09:50:34 作者: rapoo

Hibernate 3注释简介

在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准。它非常强大、灵活,而且具备了优异的性能。在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松。

  传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。创建这些映射有很多方法,可以从已有数据库模式或Java类模型中自动创建,也可以手工创建。无论如何,您最终将获得大量的 Hibernate 映射文件。此外,还可以使用工具,通过javadoc样式的注释生成映射文件,尽管这样会给您的构建过程增加一个步骤。

  在最近发布的几个Hibernate版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法。借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件——一切都会按照您的想法来定义——注释直接嵌入到您的 Java 类中,并提供一种强大及灵活的方法来声明持久性映射。籍由自动代码完成和语法突出显示功能,最近发布的Java IDE也为其提供了有力的支持。

  Hibernate Annotation还支持新的 EJB 3 持久性规范。这些规范旨在提供一种标准化的 Java 持久性机制。由于 Hibernate 3 还提供了一些扩展,因此您可以十分轻松地遵从这些标准,并使用 EJB 3 编程模型来对 Hibernate 持久层进行编码。

  现在,让我们来动手使用Hibernate Annotation。

安装 Hibernate Annotation

  要使用 Hibernate Annotation,您至少需要具备 Hibernate 3.2和Java 5。可以从 Hibernate 站点 下载 Hibernate 3.2 和 Hibernate Annotation库。除了标准的 Hibernate JAR 和依赖项之外,您还需要 Hibernate Annotations .jar 文件(hibernate-annotations.jar)、Java 持久性 API (lib/ejb3-persistence.jar)。如果您正在使用 Maven,只需要向 POM 文件添加相应的依赖项即可,如下所示:

import?javax.persistence.CascadeType;???
?2Hibernate 三注释简介import?javax.persistence.Column;???
?3Hibernate 三注释简介import?javax.persistence.Entity;???
?4Hibernate 三注释简介import?javax.persistence.FetchType;???
?5Hibernate 三注释简介import?javax.persistence.GeneratedValue;???
?6Hibernate 三注释简介import?javax.persistence.Id;???
?7Hibernate 三注释简介import?javax.persistence.OneToMany;???
?8Hibernate 三注释简介import?javax.persistence.Table;???
?9Hibernate 三注释简介import?javax.persistence.Temporal;???
10Hibernate 三注释简介import?javax.persistence.TemporalType;???
11Hibernate 三注释简介???
12Hibernate 三注释简介import?org.hibernate.annotations.Formula;???
13Hibernate 三注释简介import?org.hibernate.annotations.GenericGenerator;???
14Hibernate 三注释简介???
15Hibernate 三注释简介@Entity???
16Hibernate 三注释简介@Table(name?=?"school_info")???
17Hibernate 三注释简介Hibernate 三注释简介public?class?SchoolInfo?implements?java.io.Serializable?Hibernate 三注释简介{???
18Hibernate 三注释简介???
19Hibernate 三注释简介????@Id???
20Hibernate 三注释简介????@GeneratedValue(generator?=?"system-uuid")???
21Hibernate 三注释简介????@GenericGenerator(name?=?"system-uuid",?strategy?=?"uuid")???
22Hibernate 三注释简介????private?String?id;//hibernate的uuid机制,生成32为字符串???
23Hibernate 三注释简介???
24Hibernate 三注释简介????@Column(name?=?"actcodeId",?updatable?=?false,?nullable?=?true,?length?=?36)???
25Hibernate 三注释简介????private?String?actcodeId;???
26Hibernate 三注释简介???
27Hibernate 三注释简介????@Formula("select?COUNT(*)?from?school_info")???
28Hibernate 三注释简介????private?int?count;???
29Hibernate 三注释简介???
30Hibernate 三注释简介????@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入???
31Hibernate 三注释简介????@Column(updatable?=?false,?length?=?20)???
32Hibernate 三注释简介????private?Date?createTime;???
33Hibernate 三注释简介???
34Hibernate 三注释简介????@Temporal(TemporalType.TIMESTAMP)???
35Hibernate 三注释简介????private?Date?updateTime;//?刚开始我默认insertable=false,但会读取出错提示如下:???
36Hibernate 三注释简介????//?Value?'0000-00-00'?can?not?be?represented?as?java.sql.Timestamp???
37Hibernate 三注释简介???
38Hibernate 三注释简介????//?mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)???
39Hibernate 三注释简介????//?应该注意的是mappedBy值对应@ManyToOne标注的属性,我刚开始写成"schoolId",让我郁闷了好一会?
40Hibernate 三注释简介????@OneToMany(mappedBy?=?"school",?cascade?=?CascadeType.ALL,?fetch?=?FetchType.EAGER,?targetEntity?=?UserMember.class)???
41Hibernate 三注释简介????//?用范性的话,就不用targetEntity了???
42Hibernate 三注释简介????private?List<usermember>?users?=?</usermember>new?ArrayList<usermember>();??</usermember>?
43Hibernate 三注释简介???????
44Hibernate 三注释简介}???
45Hibernate 三注释简介


@GeneratedValue(strategy=GenerationType.AUTO)我们常用的自增长机制,我这里采用的是hibernate的uuid生成机制.
需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

郁闷的是我上面用到@Formula,生成的sql竟然是'select COUNT(*) from school_info as formula0_ from school_info schoolinfo0_,当然不能执行了,寻求正解中~!!!!!!!!!

UserMember.java(前面引入的包已经贴过了,下面就不贴了)

?1?@Entity???
?2?@Table(name?=?"teacher_info")//实体类和数据库表名不一致时,才用这个???
?3?public?class?UserMember?implements?java.io.Serializable?{???
?4????
?5?????@Id???
?6?????@GeneratedValue(generator?=?"system-uuid")???
?7?????@GenericGenerator(name?=?"system-uuid",?strategy?=?"uuid")???
?8?????private?String?id;???
?9????
10?????@Column(updatable?=?false,?nullable?=?false,?length?=?20)???
11?????private?String?logonName;???
12????????
13?????@Temporal(TemporalType.TIMESTAMP)???
14?????@Column(updatable?=?false,?length?=?20)???
15?????private?Date?createTime;???
16????
17?????@Temporal(TemporalType.TIMESTAMP)???
18?????private?Date?updateTime;???
19????
20?????@ManyToOne(cascade?=?{?CascadeType.MERGE?})???
21?????@JoinColumn(name?=?"schoolId")???
22?????private?SchoolInfo?school;???
23?????//注意该类就不用声明schoolId属性了,如果不用@JoinColumn指明关联的字段,hibernate默认会是school_id.???
24????
25?}???

?

1 楼 beykery 2012-01-31 createTime这个字段并不会在保持bean的时候自动写到数据库里,不知道你的数据库是什么,我用的mysql,在数据库里生成的类型是DATATIME不是时间戳。

读书人网 >软件架构设计

热点推荐