分享

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

 小花驴 2015-05-13
  • hibernate官方文档参考——查询:

  • https://docs./hibernate/annotations/3.4/reference/zh_cn/html_single/#d0e450
  • 在编写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):

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

    1. <?xml version='1.0' encoding='utf-8'?>  
    2. <!DOCTYPE hibernate-configuration PUBLIC  
    3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    4.         "http://www./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


    一个简单的实体类:

    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" />


    最后编写一个运行程序:

    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:

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

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

    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值来排列。

      本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多