从 hbm.xml 到 Annotations
下面让我们先看一个通常用 hbm.xml 映射文件的例子. 有3个类 .HibernateUtil.java 也就是 Hibernate文档中推荐的工具类,Person.java , Test.java 测试用的类.都在test.hibernate 包中. 每个类的代码如下:
HibernateUtil:
01 package test.hibernate;
02
03 import org.hibernate.HibernateException;
04 import org.hibernate.Session;
05 import org.hibernate.SessionFactory;
06 import org.hibernate.cfg.Configuration;
07
08 public class HibernateUtil {
09 public static final SessionFactory sessionFactory;
10
11 static {
12 try {
13 sessionFactory = new Configuration()
14 .configure()
15 .buildSessionFactory();
16 } catch (HibernateException e) {
17 // TODO Auto-generated catch block
18
19 e.printStackTrace();
20 throw new ExceptionInInitializerError(e);
21 }
22 }
23
24 public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
25
26 public static Session currentSession() throws HibernateException {
27 Session s = session.get();
28
29 if(s == null) {
30 s = sessionFactory.openSession();
31 session.set(s);
32 }
33
34 return s;
35 }
36
37 public static void closeSession() throws HibernateException {
38 Session s = session.get();
39 if(s != null) {
40 s.close();
41 }
42 session.set(null);
43 }
44 }
Person:
01 package test.hibernate;
02
03 import java.util.LinkedList;
04 import java.util.List;
05
06 /**
07 *
08 */
09
10 @SuppressWarnings("serial")
11 public class Person implements java.io.Serializable {
12
13 // Fields
14
15 private Integer id;
16
17 private String name;
18
19 private String sex;
20
21 private Integer age;
22
23 private List list = new LinkedList();
24
25 // Collection accessors
26
27 public List getList() {
28 return list;
29 }
30
31 public void setList(List list) {
32 this.list = list;
33 }
34
35 /** default constructor */
36 public Person() {
37 }
38
39 /** constructor with id */
40 public Person(Integer id) {
41 this.id = id;
42 }
43
44 // Property accessors
45
46 public Integer getId() {
47 return this.id;
48 }
49
50 public void setId(Integer id) {
51 this.id = id;
52 }
53
54 public String getName() {
55 return this.name;
56 }
57
58 public void setName(String name) {
59 this.name = name;
60 }
61
62 public String getSex() {
63 return this.sex;
64 }
65
66 public void setSex(String sex) {
67 this.sex = sex;
68 }
69
70 public Integer getAge() {
71 return this.age;
72 }
73
74 public void setAge(Integer age) {
75 this.age = age;
76 }
77
78 }
Test:
01 /*
02 * Created on
03 * @author
04 */
05 package test.hibernate;
06
07 import java.sql.SQLException;
08
09 import org.hibernate.FlushMode;
10 import org.hibernate.HibernateException;
11 import org.hibernate.Session;
12 import org.hibernate.Transaction;
13
14 public class Test {
15
16 public static void main(String [] args) {
17 Session s = HibernateUtil.currentSession();
18
19 Transaction tx = s.beginTransaction();
20
21 // Person p = (Person) s.load(Person.class, 1);
22 // System.out.println(p.getName());
23 Person p = new Person();
24
25 p.setAge(19);
26 p.setName("icerain");
27 p.setSex("male");
28 s.save(p);
29 s.flush();
30 /*
31 Person p2 = (Person) s.get(Person.class, new Integer(1));
32 System.out.println(p2.getName());
33 p2.setName("ice..");
34 s.saveOrUpdate(p2);
35 s.flush();
36 Person p3 = (Person) s.get(Person.class, new Integer(2));
37 System.out.println(p3.getName());
38 s.delete(p3);
39 */
40
41 tx.commit();
42 try {
43 System.out.println(p.getName());
44 } catch (Exception e) {
45 // TODO Auto-generated catch block
46 e.printStackTrace();
47 }
48
49 HibernateUtil.closeSession();
50 }
51 }
hibernate.cfg.xml 配置文件如下,利用mysql 数据库.
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.password">你的数据库密码</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/数据库名</property>
<property name="hibernate.connection.username">用户名</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.transaction.auto_close_session">false</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="test/hibernate/annotation/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
其中 配置了<property name="hibernate.hbm2ddl.auto">update</property>属性 自动导入数据库ddl.生产的ddl sql语句如下
create table person (id integer not null auto_increment, name varchar(255), sex varchar(255), age integer, person integer, primary key (id))
alter table person add index FKC4E39B5511C4A5C2 (person), add constraint FKC4E39B5511C4A5C2 foreign key (person) references person (id)
而Person.hbm.xml 文件如下:
<?xml version="1.0"?>
<hibernate-mapping>
<class name="test.hibernate.Person" table="person">
<id name="id" type="integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="name" type="string">
<column name="name" />
</property>
<property name="sex" type="string">
<column name="sex" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<bag name="list" cascade="all">
<key column="person"></key>
<one-to-many class="test.hibernate.Person"/>
</bag>
</class>
</hibernate-mapping>
下面让我们看看利用 Hibernate Annotations 如何做,只要三个类 不再需要 hbm.xml配置文件:
还要把用到的两个jar文件 放入的类路径中. 具体如何做,请参考 Hibernate Annotations 中文文档
http://hibernate.6644.net
HibernateUtil.java 也就是 Hibernate文档中推荐的工具类,Person.java 一个持久化的类, Test.java 测试用的类.都在test.hibernate.annotation 包中. 每个类的代码如下:
HibernateUtil
01 package test.hibernate.annotation;
02
03 import org.hibernate.HibernateException;
04 import org.hibernate.Session;
05 import org.hibernate.SessionFactory;
06 import org.hibernate.cfg.AnnotationConfiguration;
07 import org.hibernate.cfg.Configuration;
08
09 public class HibernateUtil {
10 public static final SessionFactory sessionFactory;
11
12 static {
13 try {
14 sessionFactory = new AnnotationConfiguration() //注意: 建立 SessionFactory于前面的不同
15 .addPackage("test.hibernate.annotation")
16 .addAnnotatedClass(Person.class)
17
18 .configure()
19 .buildSessionFactory();
20 //new Configuration().configure().buildSessionFactory();
21 } catch (HibernateException e) {
22 // TODO Auto-generated catch block
23
24 e.printStackTrace();
25 throw new ExceptionInInitializerError(e);
26 }
27 }
28
29 public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
30
31 public static Session currentSession() throws HibernateException {
32 Session s = session.get();
33
34 if(s == null) {
35 s = sessionFactory.openSession();
36 session.set(s);
37 }
38
39 return s;
40 }
41
42 public static void closeSession() throws HibernateException {
43 Session s = session.get();
44 if(s != null) {
45 s.close();
46 }
47 session.set(null);
48 }
49 }
Person:
01 package test.hibernate.annotation;
02
03 import java.util.LinkedList;
04 import java.util.List;
05
06 import javax.persistence.AccessType;
07 import javax.persistence.Basic;
08 import javax.persistence.Entity;
09 import javax.persistence.GeneratorType;
10 import javax.persistence.Id;
11 import javax.persistence.OneToMany;
12 import javax.persistence.Table;
13 import javax.persistence.Transient;
14
15 /**
16 *
17 */
18
19 @SuppressWarnings("serial")
20 @Entity(access = AccessType.PROPERTY) //定义该类为实体类
21 @Table //映射表
22 public class Person implements java.io.Serializable {
23
24 // Fields
25
26 private Integer id;
27
28 private String name;
29
30 private String sex;
31
32 private Integer age;
33
34 private List list = new LinkedList();
35
36 // Constructors
37 /** default constructor */
38 public Person() {
39 }
40
41 /** constructor with id */
42 public Person(Integer id) {
43 this.id = id;
44 }
45
46 // Property accessors
47 @Id
48 public Integer getId() {
49 return this.id;
50 }
51
52 public void setId(Integer id) {
53 this.id = id;
54 }
55
56 @Basic
57 public String getName() {
58 return this.name;
59 }
60
61 public void setName(String name) {
62 this.name = name;
63 }
64
65 @Basic
66 public String getSex() {
67 return this.sex;
68 }
69
70 public void setSex(String sex) {
71 this.sex = sex;
72 }
73
74 @Basic
75 public Integer getAge() {
76 return this.age;
77 }
78
79 public void setAge(Integer age) {
80 this.age = age;
81 }
82 @Transient //由于本例不打算演示集合映射 所有声明该属性为 Transient
83 public List getList() {
84 return list;
85 }
86
87 public void setList(List list) {
88 this.list = list;
89 }
90
91 }
注意该实体类中的属性都使用了默认值.
Test.java 代码同上
不需要了 hbm.xml 映射文件, 是不是简单了一些 .给人认为简化了一些不是主要目的.主要是可以了解一下 EJB3 的持久化机制 ,提高一下开发效率才是重要的.
好了 .本例就完了 . 感觉怎么样了 .欢迎你来批批.
PS:
生成的数据库表 和 程序执行后的 数据库情况如下
mysql> describe person;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| sex | varchar(255) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| person | int(11) | YES | MUL | NULL | |
+--------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> select * from person;
+----+---------+------+------+--------+
| id | name | sex | age | person |
+----+---------+------+------+--------+
| 1 | icerain | male | 19 | NULL |
+----+---------+------+------+--------+
1 row in set (0.03 sec)
相关推荐
都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm.xml映射方式
Hibernate Annotations API 中文文档 前言 1. 创建一个注解项目 1.1. 系统需求 1.2. 系统配置 2. 实体Bean 2.1. 简介 2.2. 用EJB3注解进行映射 2.2.1. 声明实体bean 2.2.1.1. 定义表(Table) 2.2.1.2. 乐观...
hibernate xml annotations 代码 的例子 两种实例 。
All possible basic and advanced Hibernate mappings are shown in this book, with hundreds of examples in Hibernate's XML format, including Java Persistence annotations for JDK 5.0. Readers can get ...
在Hibernate 2.x里,多数情况下表示映射关系的元数据保存在XML文本文件中. 还有一种方式就是Xdoclet,它可以在编译时利用Javadoc中的源码注释信息来进行预处理. 现在新的JDK标准(JDK1.5以上)也支持类似的注解功能,...
Hibernate 注解的说明文档 第 1 章 创建一个注解项目 第 2 章 实体Bean 第 3 章 通过XML覆写元数据 第 4 章 Hibernate验证器 第 5 章 Hibernate与Lucene集成
myeclipse的自带hibernate jar包不支持注解;自己找的hibernate注解所需的jar包:hibernate-core;hibernate-annotation;hbm-cfg-xml;log4j.properties
Hibernate Search主要有以下功能特点:1,功能强大,配置简单 - 配置只需要修改persistence.xml(JPA),hibernate.cfg.xml(Hibernate)2,支持Hibernate,以及EJB3 JPA标准应用3,集成全文搜索引擎Lucene - Lucene...
Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } } @Entity ...
Hibernate XML files, and more How to search and query with the new version of Hibernate How to integrate with MongoDB using NoSQL Who this book is for This book is for Java developers who want to ...
This tutorial show how to use Hibernate/JPA Named Queries. We start by explaining why we would use ... Next, we show an example of how to use named queries, either with annotations or XML configuration.
dom4j-1.6.1.jar dom4j是一个Java的XML API,类似于jdom, 用来读写XML文件的,这是必须使用的jar包,Hibernate用它来读写配置文件 commons-collections-3.2.jar Apache Commons包中的一个, 包含了一些Apache开发的...
2 下载hibernate-annotations-3[1].4.0.GA 5 3 注意阅读hibernate compatibility matrix(hibernate 网站download) 5 4 下载slf4jl.5.8 6 Hibernate HelloWorld 6 1 建立新java 项目,名为hibernate_0100_HelloWorld 6...
hibernate-commons-annotations-5.0.1.Final.jar hibernate-core-5.0.7.Final.jar hibernate-ehcache-5.0.7.Final.jar hibernate-entitymanager-5.0.7.Final.jar hibernate-envers-5.0.7.Final.jar hibernate-...
18.1.1. Specifying XML and class mapping together 18.1.2. Specifying only an XML mapping 18.2. XML mapping metadata 18.3. Manipulating XML data 19. Improving performance 19.1. Fetching strategies ...
解析:来源:Hibernate提供了Hibernate Annotations扩展包,它可以替换复杂的hbm.xml文件( Annotations扩展包是hibernate-annotation-3.4.0GA.zip) 作用:使得Hibernate程序的开发大大的简化。利用注解后,可不用...
The default metadata source are annotations, with the ability to override and extend the metadata through the use of XML validation descriptors. Documentation The documentation for this release is ...
2.2.1 使用Hibernate Annotations 2.2.2 使用Hibernate EntityManager 2.2.3 引入EJB组件 2.2.4 切换到Hibernate接口 2.3 反向工程遗留数据库 2.3.1 创建数据库配置 2.3.2 定制反向工程 ...
1)Demo 学习要点简介: ...2.Eclipse 导入后可能需要在 Xml Catalog 手动添加:ehcache-spring-1.2.xsd(ehcache-spring-annotations-1.2.0-sources.jar里面有,自己找下)。 3.内附Oracle建表等可执行语句。
FastInfoset-1.2.12.jar,geronimo-javamail_1.4_spec-1.7.1.jar,geronimo-jaxws_2.2_spec-1.1.jar,geronimo-jms_1.1_spec-1.1.1.jar,geronimo-servlet_3.0_spec-1.0.jar,hibernate-annotations.jar,hibernate-...