`
KuangYeYaZi
  • 浏览: 55877 次
文章分类
社区版块
存档分类
最新评论

Hibernate Annotations 实战(一)

 
阅读更多

来源: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)

分享到:
评论

相关推荐

    hibernate-annotations-3.4.0.GA

    而Hibernate Annotations是Hibernate框架的一个重要组成部分,它引入了基于注解的元数据,使得代码更加简洁、易读。本篇将详细探讨Hibernate Annotations 3.4.0.GA版本中的核心概念、特性以及实际应用。 一、...

    hibernate-annotations-3.4.0(参考文档,doc/../index.html)

    Hibernate Annotations是Hibernate框架的一个扩展,它允许开发者使用Java语言的注解(Annotations)来定义对象与数据库表之间的映射关系,替代传统的Hibernate XML配置文件。这使得代码更加简洁,更易于维护,并且与...

    hibernate_annotations spring2.0中文参考手册

    6. **实战示例**:提供实际的项目案例,演示如何在 Spring 2.0 应用中配置和使用 Hibernate Annotations,包括数据库初始化、数据存取和事务处理等。 7. **性能优化**:讨论 Hibernate 的缓存策略、批处理操作和懒...

    hibernate-annotations-3.4.0.CR2正式版.zip

    总结,Hibernate Annotations 3.4.0.CR2提供了一种高效、灵活的数据持久化方案,它简化了开发过程,增强了代码的可读性和可维护性。无论是在中小型企业项目还是大型复杂系统中,都能看到其广泛而深入的应用。对于...

    Hibernate实战(第2版 中文高清版)

     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 定制反向工程 ...

    搭建hibernate 2011年最新jar包

    这篇文章将详细介绍如何使用2011年的最新Hibernate jar包来搭建一个完整的Hibernate框架,并特别提到包含了ehcache-1.6.2.jar,这是一个用于缓存管理的重要组件。 一、Hibernate简介 Hibernate是一个开放源代码的...

    Hibernate中文文档+hibernate annotation +distribution

    《Hibernate技术深度解析:中文文档与实战指南》 在Java世界中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨Hibernate的核心概念,结合提供的中文文档,以及...

    hibernate-tutorials_java_hibernate_Eclipse_fallenweg_

    总的来说,"hibernate-tutorials_java_hibernate_Eclipse_fallenweg_"这个资源包提供了一个全面的学习路径,涵盖了从安装配置到实际开发的所有关键步骤,对于希望掌握Hibernate的Java开发者来说是一份宝贵的资料。...

    myeclipse中的hibernate反转

    这对于初学者来说,是一个快速理解和实践Hibernate的好方法。 1. **项目结构**: 在开始反转之前,首先需要构建一个合理的项目结构。通常,我们会创建一个名为`Po`的包来存放反转出的实体类,而`xxx.hbm.xml`映射...

    Hibernate开发资料

    在这个版本中,Hibernate引入了新的功能,如Criteria API和Hibernate Annotations,这使得无需XML配置即可进行对象映射。阅读此手册,开发者可以了解到这些新特性如何使用,以及它们如何改进了开发流程。 5. **...

    hibernate-release-4.2.2.Final

    4. hibernate-commons-annotations.jar:提供通用的注解,如@Table、@Column等。 5. 数据库驱动JAR:根据实际使用的数据库(如MySQL、Oracle等),需添加相应的数据库驱动JAR。 6. 其他依赖库:如slf4j、dom4j、...

    hibernate-3.4.0

    其中,“hibernate-annotations-3.4.0.CR1”是重要的子模块之一,它是Hibernate注解API的组成部分,允许开发者在实体类上使用注解来定义数据表和字段的映射,从而实现对象模型到数据库模式的映射。 一、Hibernate...

    hibernate-release-5.2.0.Final

    - `hibernate-annotations`:提供ORM元数据注解的实现。 - `hibernate-validator`:集成Bean Validation,进行数据校验。 - `tests`:测试代码,用于验证框架功能的正确性。 四、源码探索 1. SessionFactory:是...

    hibernate。jar

    《Hibernate源码解析与实战应用》 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了Java数据库编程。本资源包含了hibernate的源码,为开发者提供了深入学习和研究的宝贵材料。通过这个源码,...

    Hibernate教程-最全-最好_204页

    《Hibernate教程-最全-最好_204页》是一个深度涵盖Hibernate框架的全面教程,旨在帮助初学者和进阶者深入理解并掌握这一强大的Java持久化技术。在这个204页的教程中,读者将了解到如何利用Hibernate来简化数据库操作...

    struts2+spring2+hibernate3 Annotation的整合

    在Hibernate3中,引入了Annotations,使得对象模型与数据库表的映射更加直观和灵活,无需XML配置文件。 4. **整合过程**: - **配置Spring**:创建Spring的配置文件,定义Bean并使用注解进行配置,如@Service、@...

    持久层课件

    本课件主要介绍了Hibernate作为持久层框架的原理与实战应用。 在Java编程中,对象的生命周期分为三个状态:瞬时态(Transient)、持久态(Persistent)和脱管态(Detached)。瞬时态的对象没有与数据库中的记录关联...

    jozi-jug-annotations:来自 jozi-jug 注释演示的源代码

    7. **实战示例**:通过实际的代码片段,项目可能会展示如何在MVC框架、ORM工具(如Hibernate)或测试框架(如JUnit)中使用注解来简化配置和增强功能。 总之,`jozi-jug-annotations`项目是学习和理解Java注释应用...

Global site tag (gtag.js) - Google Analytics