Hibernate使用注解映射取代映射文件

在编写hibernate的时候,需要将实体类映射到数据库中的表。通常需要一个配置文件(hibernate.cfg.xml),一个实体类(XX.Java),还有一个映射文件(XX.hbm.xml)。从JAVA5.0之后,可以利用注解来简化配置。简单来说就是不再需要映射文件了,hibernate需要的元数据(metadata)通过注解实体类就行了。


下面是一个简单的基于注解映射的Hibernate Hello World项目:


用到的工具和技术:1.Eclipse4.2.2

    2.Maven 3

    3.Hibernate 4.2.2.Final

    4.JPA


首先是项目的整体架构



项目的依赖(pom.xml):

[html]  view plain  copy
  1. <dependencies>  
  2.   <dependency>  
  3.     <groupId>junit</groupId>  
  4.     <artifactId>junit</artifactId>  
  5.     <version>3.8.1</version>  
  6.     <scope>test</scope>  
  7.   </dependency>  
  8.   <dependency>  
  9.     <groupId>org.hibernate</groupId>  
  10.     <artifactId>hibernate-core</artifactId>  
  11.     <version>4.2.2.Final</version>  
  12.   </dependency>  
  13. </dependencies>  

JPA jar包在hibernate3.6之后被放入hibernate-core包中。


Hibernate的配置文件(hibernate.cfg.xml):

[html]  view plain  copy
  1. <?xml version='1.0' encoding='utf-8'?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4.         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7.   
  8.     <session-factory>  
  9.   
  10.         <!-- Database connection settings -->  
  11.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  12.         <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  
  13.         <property name="connection.username">username</property>  
  14.         <property name="connection.password">password</property>  
  15.   
  16.   
  17.         <!-- SQL dialect -->  
  18.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  19.   
  20.   
  21.         <!-- Echo all executed SQL to stdout -->  
  22.         <property name="show_sql">true</property>  
  23.         <property name="format_sql">true</property>  
  24.         <!-- Drop and re-create the database schema on startup -->  
  25.         <property name="hbm2ddl.auto">update</property>  
  26.   
  27.         <mapping class="org.hibernate.test.tutorial.Person" />  
  28.     </session-factory>  
  29.   
  30. </hibernate-configuration>  

注意:需要在Mysql数据库中创建一个test数据库  CREATE DATABASE test


一个简单的实体类:

[java]  view plain  copy
  1. package org.hibernate.test.tutorial;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Date;  
  5.   
  6. import javax.persistence.Column;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.GenerationType;  
  10. import javax.persistence.Id;  
  11. import javax.persistence.Table;  
  12. import javax.persistence.Temporal;  
  13. import javax.persistence.TemporalType;  
  14.   
  15. @Entity  
  16. @Table(name="T_PERSONS")  
  17. public class Person implements Serializable {  
  18.   
  19.     private static final long serialVersionUID = 1L;  
  20.       
  21.     private Long id;  
  22.     private String name;  
  23.     private double age;  
  24.     private Date birth;  
  25.       
  26.     @Id  
  27.     @GeneratedValue(strategy=GenerationType.AUTO)  
  28.     @Column(name="ID",unique=true)  
  29.     public Long getId() {  
  30.         return id;  
  31.     }  
  32.       
  33.     @SuppressWarnings("unused")  
  34.     private void setId(Long id) {  
  35.         this.id = id;  
  36.     }  
  37.       
  38.     @Column(name="NAME",length=20)  
  39.     public String getName() {  
  40.         return name;  
  41.     }  
  42.       
  43.     public void setName(String name) {  
  44.         this.name = name;  
  45.     }  
  46.       
  47.     @Column(name="AGE")  
  48.     public double getAge() {  
  49.         return age;  
  50.     }  
  51.       
  52.     public void setAge(double age) {  
  53.         this.age = age;  
  54.     }  
  55.       
  56.     @Temporal(TemporalType.DATE)  
  57.     @Column(name="BIRTH_DATE")  
  58.     public Date getBirth() {  
  59.         return birth;  
  60.     }  
  61.     public void setBirth(Date birth) {  
  62.         this.birth = birth;  
  63.     }  
  64.   
  65. }  

注意需要在Hibernate配置文件中注册该实体类:  <mapping class="org.hibernate.test.tutorial.Person" />


最后编写一个运行程序:

[java]  view plain  copy
  1. public static void main( String[] args )  
  2. {  
  3.     SessionFactory factory = new Configuration().configure().buildSessionFactory();  
  4.     Session session = factory.openSession();  
  5.       
  6.     session.beginTransaction(); // 开启事务  
  7.       
  8.     try{  
  9.     Person p = new Person();  
  10.     p.setName("Benson");  
  11.     p.setAge(22);  
  12.     p.setBirth(new Date());  
  13.       
  14.     session.save(p);  
  15.     } catch(Exception e) {  
  16.         e.printStackTrace();  
  17.         session.getTransaction().rollback();    // 回滚事务  
  18.     }  
  19.       
  20.     session.getTransaction().commit();  // 提交事务  
  21. }  

运行之后,可以在Ecilpse控制台观察到Hibernate为我们自动生成的格式化后的SQL:

[plain]  view plain  copy
  1. Hibernate:   
  2.     insert   
  3.     into  
  4.         T_PERSONS  
  5.         (AGE, BIRTH_DATE, NAME)   
  6.     values  
  7.         (?, ?, ?)  

进入Mysql控制台,可以查看到自动生成(hibernate.hbm2dll.auto)的表和插入的记录。

[plain]  view plain  copy
  1. mysql> show create table t_persons\G  
  2. *************************** 1. row ***************************  
  3.        Table: t_persons  
  4. Create Table: CREATE TABLE `t_persons` (  
  5.   `ID` bigint(20) NOT NULL AUTO_INCREMENT,  
  6.   `AGE` double DEFAULT NULL,  
  7.   `BIRTH_DATE` date DEFAULT NULL,  
  8.   `NAME` varchar(20) DEFAULT NULL,  
  9.   PRIMARY KEY (`ID`)  
  10. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8  
  11. 1 row in set (0.00 sec)  
  12.   
  13. mysql> select * from t_persons;  
  14. +----+------+------------+--------+  
  15. | ID | AGE  | BIRTH_DATE | NAME   |  
  16. +----+------+------------+--------+  
  17. |  1 |   22 | 2013-06-30 | Benson |  
  18. +----+------+------------+--------+  
  19. 1 row in set (0.00 sec)  


有一个疑问就是实体类的属性声明顺序和数据库表中的字段顺序不对应,一个可能的原因就是,在生成DDL时,是按照属性的ASCII值来排列。


转载自:http://blog.csdn.net/tounaobun/article/details/9207181

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值