来源:http://www.360doc.com/content/06/0425/12/5136_104878.shtml
-- 从 hbm.xml 到 Annotations
任何获得Matrix授权的网站,转载请保留以下作者信息和链接:
作者:icess(作者的blog:http://blog.matrix.org.cn/page/icess)
关键字:Hibernate Validator
下面让我们先看一个通常用 hbm.xml 映射文件的例子. 有3个类 .HibernateUtil
.java 也就是 Hibernate文档中推荐的工具类,Person
.java 一个持久化的类, Test.java 测试用的类.都在test.hibernate
包中. 每个类的代码如下:
HIbernateUtil工具类:
package test.hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { public static final SessionFactory sessionFactory; static { try { sessionFactory = new Configuration() .configure() .buildSessionFactory(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new ExceptionInInitializerError(e); } } public static final ThreadLocal<Session> session = new ThreadLocal<Session>(); public static Session currentSession() throws HibernateException { Session s = session.get(); if(s == null) { s = sessionFactory.openSession(); session.set(s); } return s; } public static void closeSession() throws HibernateException { Session s = session.get(); if(s != null) { s.close(); } session.set(null); } }
用户实体类:Person
package test.hibernate; import java.util.LinkedList; import java.util.List; /** * */ @SuppressWarnings("serial") public class Person implements java.io.Serializable { // Fields private Integer id; private String name; private String sex; private Integer age; private List list = new LinkedList(); // Collection accessors public List getList() { return list; } public void setList(List list) { this.list = list; } /** default constructor */ public Person() { } /** constructor with id */ public Person(Integer id) { this.id = id; } // Property accessors public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getSex() { return this.sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } }
/* * Created on * @author */ package test.hibernate; import java.sql.SQLException; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; public class Test { public static void main(String [] args) { Session s = HibernateUtil.currentSession(); Transaction tx = s.beginTransaction(); // Person p = (Person) s.load(Person.class, 1); // System.out.println(p.getName()); Person p = new Person(); p.setAge(19); p.setName("icerain"); p.setSex("male"); s.save(p); s.flush(); /* Person p2 = (Person) s.get(Person.class, new Integer(1)); System.out.println(p2.getName()); p2.setName("ice.."); s.saveOrUpdate(p2); s.flush(); Person p3 = (Person) s.get(Person.class, new Integer(2)); System.out.println(p3.getName()); s.delete(p3); */ tx.commit(); try { System.out.println(p.getName()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } HibernateUtil.closeSession(); } }hibernate.cfg.xml 配置文件如下,利用mysql 数据库.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <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"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <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://hb.6644.netHibernateUtil.java 也就是 Hibernate文档中推荐的工具类,Person.java 一个持久化的类, Test.java 测试用的类.都在test.hibernate.annotation 包中. 每个类的代码如下:
package test.hibernate.annotation; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; public class HibernateUtil { public static final SessionFactory sessionFactory; static { try { sessionFactory = new AnnotationConfiguration() //注意: 建立 SessionFactory于前面的不同 .addPackage("test.hibernate.annotation") .addAnnotatedClass(Person.class) .configure() .buildSessionFactory(); //new Configuration().configure().buildSessionFactory(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new ExceptionInInitializerError(e); } } public static final ThreadLocal<Session> session = new ThreadLocal<Session>(); public static Session currentSession() throws HibernateException { Session s = session.get(); if(s == null) { s = sessionFactory.openSession(); session.set(s); } return s; } public static void closeSession() throws HibernateException { Session s = session.get(); if(s != null) { s.close(); } session.set(null); } }
package test.hibernate.annotation; import java.util.LinkedList; import java.util.List; import javax.persistence.AccessType; import javax.persistence.Basic; import javax.persistence.Entity; import javax.persistence.GeneratorType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; /** * */ @SuppressWarnings("serial") @Entity(access = AccessType.PROPERTY) //定义该类为实体类 @Table //映射表 public class Person implements java.io.Serializable { // Fields private Integer id; private String name; private String sex; private Integer age; private List list = new LinkedList(); // Constructors /** default constructor */ public Person() { } /** constructor with id */ public Person(Integer id) { this.id = id; } // Property accessors @Id public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Basic public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Basic public String getSex() { return this.sex; } public void setSex(String sex) { this.sex = sex; } @Basic public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } @Transient //由于本例不打算演示集合映射 所有声明该属性为 Transient public List getList() { return list; } public void setList(List list) { this.list = list; } }
注意该实体类中的属性都使用了默认值.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)
相关推荐
现在已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*....
hibernate-annotations-3.4.0.GA hibernate-annotations-3.4.0.GA hibernate-annotations-3.4.0.GA
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 annotations 中文参考手册
Hibernate Annotations 中文版
webwork2.1.7 中文开发文档 Hibernate Annotations参考文档-3.20中文开发文档 Hibernate_3.2.0_Reference_zh_CN中文开发文档
hibernate annotations 3.4.0.GA API
hibernate 和hibernate_annotations(中文API)帮助文档。
hibernate annotations
Hibernate3.2 Annotations中文文档 Hibernate3.2 Annotations中文文档 Hibernate3.2 Annotations中文文档 网页格式
hibernate annotations 的中文帮助文档 可以帮您更好的学习hibernate 的注解配置
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1947270
hibernate-annotations.jar
hibernate annotations 核心包,欢迎下载
hibernate-annotations-3.4.0
使用注解Annotation时用的jar包。 包括: hibernate-commons-annotations-3.3.0.ga.jar hibernate-entitymanager.jar ejb3-persistence.jar hibernate-annotations.jar
Hibernate Annotations API英文版,CHM格式
hibernate-annotations-3.4.0.CR1中文电子书
hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...