Hibernate 零配置之Annotation注解

  JPA规范推荐使用Annotation来管理实体类与数据表之间的映射关系,从而避免同时维护两份文件(Java 实体类 和 XML 映射文件),将映射信息(写在Annotation中)与实体类集中在一块儿。java

  如下我将使用eclipse来构建一个简单使用注解取代*.hbm.xml的查询小例子。(p.s 建议不要使用Myeclipse,他很方便可是对于初学者来讲没有eclipse学得牢靠)mysql

1.在数据库中构建一张表sql

 

2.生成相应的hibernate.cfg.xml文件数据库

<?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>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/zzh</property>
        <property name="hibernate.connection.username">root</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>
View Code

注意,在生成cfg.xml文件时,要create Hibernate Console Configurationsession

3.生成hibernate.reveng.xml逆向工程app

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >

<hibernate-reverse-engineering>
  <table-filter match-catalog="zzh" match-name="commodity"/>
</hibernate-reverse-engineering>
View Code

在Eclipse界面工具栏,择Hibernate code generation Configuration,new 一个新的配置。框架

4.选择Exporters的选项,接下来是重点!!!eclipse

选择勾选的两项,再也不选.hbm.xml.ide

点击Run。工具

5.只生成了与数据表对应的实体类Commodity.java,而没有生成与该实体类对应的映射文件Commodity.hbm.xml,打开实体类

package com.zzh;
// Generated 2016-8-28 9:42:01 by Hibernate Tools 4.3.1.Final

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Commodity generated by hbm2java
 */
@Entity
@Table(name = "commodity", catalog = "zzh")
public class Commodity implements java.io.Serializable {

    private Integer id;
    private String name;
    private Double price;
    private String unit;
    private String category;
    private String description;
    private Integer seller;

    public Commodity() {
    }

    public Commodity(String name, Double price, String unit, String category, String description, Integer seller) {
        this.name = name;
        this.price = price;
        this.unit = unit;
        this.category = category;
        this.description = description;
        this.seller = seller;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "Id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "name", length = 100)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "price", precision = 11)
    public Double getPrice() {
        return this.price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Column(name = "unit", length = 50)
    public String getUnit() {
        return this.unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }

    @Column(name = "category", length = 100)
    public String getCategory() {
        return this.category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    @Column(name = "description", length = 1000)
    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Column(name = "seller")
    public Integer getSeller() {
        return this.seller;
    }

    public void setSeller(Integer seller) {
        this.seller = seller;
    }

}

使用@Entity注解,表示当前类为实体Bean,须要进行持久化,使用@Table注解实现数据表 commodity 与持久化类Commodity之间的映射,@Id注解指定当前持久化类的ID属性,使用@GeneratedValue注解指定ID表示生成器,使用@Column注解指定当前属性所对应的数据表中的字段,name指定字段名;unique指定是否为惟一,nullable指定是否可为null。

6.在hibernate.cfg.xml中配置映射信息

  <mapping class="com.zzh.Commodity"/>

必定要注意mapping后面是class,若是是配置*.hbm.xml就是resource

7.添加会话工厂类HibernateUtil以获取Session

package com.zzh.utl;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        // 建立Configuration对象,读取hibernate.cfg.xml文件,完成初始化
        Configuration config = new Configuration().configure();
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties());
        StandardServiceRegistry ssr=ssrb.build();
        sessionFactory=config.buildSessionFactory(ssr);
    }
    
    //获取SessionFactory
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    
    //获取Session
    public static Session getSession(){
        session=sessionFactory.openSession();
        return session;
    }
    
    //关闭Session
    public static void closeSession(Session session){
        if(session!=null){
            session.close();
        }
    }
}
View Code

8.用JUnit建立一个类ZhuShi.java用于测试

package anno;

import static org.junit.Assert.*;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.hibernate.annotations.*;

import com.zzh.Commodity;
import com.zzh.utl.HibernateUtil;

public class ZhuShi {
    Session session = null;
    @Before
    public void setUp() throws Exception {
        session = HibernateUtil.getSession();
    }

    @After
    public void tearDown() throws Exception {
        session.close();
    }

    @Test
    public void test() {
        String hql = " from Commodity ";
        Query query = session.createQuery(hql);
        List<Commodity> c = query.list();
        for (Commodity commodity : c) {
            System.out.println("name"+commodity.getName());
        }
    }

}

9.整个文件已经造成

运行测试,获得结果

10.总结

  原来大量的*.hbm.xml文件再也不须要了,全部的配置都经过Annotation注解直接在持久化类中配置完成。

11.我的想法

  以前我有过不用注解后来由于路径调试半天的经历,那时本身也是笨,我就跟你们讲讲;我当时也是用反向工程生成实体类,还有*.hbm.xml文件,当时的hbm.xml文件以下所示:(注意看我红笔画出的部分)

 

因为是工具帮我生成的我也没在乎,而后高高兴兴去配置cfg.xml文件去了(以下所示):

 

所有文件以下所示:

觉得一切顺利,便用JUnit进行测试:

实体类没法找到,坑爹呀,我都是按工具一步一步来的呀,为何会这样,后来才发现*.hbm.xml中class便签中name出错了,必须加上包名才行:

再进行测试:

  总算成功了,这不表明*.hbm.xml很差,其实主要仍是怪本身经验不足,乱用工具,初学者仍是多用*.hbm.xml文件要好,毕竟能更好掌握其中的元素和映射信息与方式,不过就之后熟练后,仍是用注释更为简洁和方便管理。

  若是你以为还不错,请继续关注我或帮我点赞,谢谢观看!

                                                                                                                  ---参考资料《Struts2+Spring3+Hibernate框架技术精讲与整合案例》

相关文章
相关标签/搜索