您的位置:首页 > 其它

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

2016-06-08 16:43 351 查看
在编写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

<dependencies>  

  <dependency>  

    <groupId>junit</groupId>  

    <artifactId>junit</artifactId>  

    <version>3.8.1</version>  

    <scope>test</scope>  

  </dependency>  

  <dependency>  

    <groupId>org.hibernate</groupId>  

    <artifactId>hibernate-core</artifactId>  

    <version>4.2.2.Final</version>  

  </dependency>  

</dependencies>  

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

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

[html] view
plain copy

<?xml version='1.0' encoding='utf-8'?>  

<!DOCTYPE hibernate-configuration PUBLIC  

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  

  

<hibernate-configuration>  

  

    <session-factory>  

  

        <!-- Database connection settings -->  

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  

        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  

        <property name="connection.username">username</property>  

        <property name="connection.password">password</property>  

  

  

        <!-- SQL dialect -->  

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  

  

  

        <!-- Echo all executed SQL to stdout -->  

        <property name="show_sql">true</property>  

        <property name="format_sql">true</property>  

        <!-- Drop and re-create the database schema on startup -->  

        <property name="hbm2ddl.auto">update</property>  

  

        <mapping class="org.hibernate.test.tutorial.Person" />  

    </session-factory>  

  

</hibernate-configuration>  

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

一个简单的实体类:

[java] view
plain copy

package org.hibernate.test.tutorial;  

  

import java.io.Serializable;  

import java.util.Date;  

  

import javax.persistence.Column;  

import javax.persistence.Entity;  

import javax.persistence.GeneratedValue;  

import javax.persistence.GenerationType;  

import javax.persistence.Id;  

import javax.persistence.Table;  

import javax.persistence.Temporal;  

import javax.persistence.TemporalType;  

  

@Entity  

@Table(name="T_PERSONS")  

public class Person implements Serializable {  

  

    private static final long serialVersionUID = 1L;  

      

    private Long id;  

    private String name;  

    private double age;  

    private Date birth;  

      

    @Id  

    @GeneratedValue(strategy=GenerationType.AUTO)  

    @Column(name="ID",unique=true)  

    public Long getId() {  

        return id;  

    }  

      

    @SuppressWarnings("unused")  

    private void setId(Long id) {  

        this.id = id;  

    }  

      

    @Column(name="NAME",length=20)  

    public String getName() {  

        return name;  

    }  

      

    public void setName(String name) {  

        this.name = name;  

    }  

      

    @Column(name="AGE")  

    public double getAge() {  

        return age;  

    }  

      

    public void setAge(double age) {  

        this.age = age;  

    }  

      

    @Temporal(TemporalType.DATE)  

    @Column(name="BIRTH_DATE")  

    public Date getBirth() {  

        return birth;  

    }  

    public void setBirth(Date birth) {  

        this.birth = birth;  

    }  

  

}  

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

最后编写一个运行程序:

[java] view
plain copy

public static void main( String[] args )  

{  

    SessionFactory factory = new Configuration().configure().buildSessionFactory();  

    Session session = factory.openSession();  

      

    session.beginTransaction(); // 开启事务  

      

    try{  

    Person p = new Person();  

    p.setName("Benson");  

    p.setAge(22);  

    p.setBirth(new Date());  

      

    session.save(p);  

    } catch(Exception e) {  

        e.printStackTrace();  

        session.getTransaction().rollback();    // 回滚事务  

    }  

      

    session.getTransaction().commit();  // 提交事务  

}  

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

[plain] view
plain copy

Hibernate:   

    insert   

    into  

        T_PERSONS  

        (AGE, BIRTH_DATE, NAME)   

    values  

        (?, ?, ?)  

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

[plain] view
plain copy

mysql> show create table t_persons\G  

*************************** 1. row ***************************  

       Table: t_persons  

Create Table: CREATE TABLE `t_persons` (  

  `ID` bigint(20) NOT NULL AUTO_INCREMENT,  

  `AGE` double DEFAULT NULL,  

  `BIRTH_DATE` date DEFAULT NULL,  

  `NAME` varchar(20) DEFAULT NULL,  

  PRIMARY KEY (`ID`)  

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8  

1 row in set (0.00 sec)  

  

mysql> select * from t_persons;  

+----+------+------------+--------+  

| ID | AGE  | BIRTH_DATE | NAME   |  

+----+------+------------+--------+  

|  1 |   22 | 2013-06-30 | Benson |  

+----+------+------------+--------+  

1 row in set (0.00 sec)  

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

转载自:http://blog.csdn.net/tounaobun/article/details/9207181
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息