Hibernate3.1.3使用自定义实体类实现对SQL查询语句的映射

来源:互联网 发布:python之父谈go 编辑:程序博客网 时间:2024/06/05 07:53

Hibernate3.1.3使用自定义实体类实现映射

前言:

在使用Hibernate操作数据库时, 特别是进行查询时,往往要使用存储过程或一些不方便使用实体类映射的SQL语句。这时就要用到hibernate的自定义SQL语句映射类。下面来介绍一下该过程的实现。

 

1.下载Hibernate3.1.3(比较老的版本了,不过能实现就可以,而且这个版本能实现,那么更新的版本当然也能实现), 一般可以到sourceforge.net下载。如果你上不了这个网站也没关系,我的百度网盘共享有了,直接下载并解压两个包。还有hibernate-jpa-2.0-api-1.0.0.Final.jar也需要下载。

链接:http://pan.baidu.com/s/1sjNnqeL 密码:yq4q

 

2.在IDE(一般是Eclipse或Netbeans,一样的了)里建立两个库hibernate3.1.3和hibernate3.1.x-annotation。

下面我以netbeans为例说明:在netbeans主菜单里,工具-->库-->新建库(N)(按钮),命名"Hibernate3.1.3",“确定”;这时“库(L)”列表中就多出了一个"Hibernate3.1.3"的库,单击选择这个库,在右边点按钮“添加JAR/文件夹”,选择上面第一步解压出来的.../hibernate3.1/hibernate3.jar, 确认添加后。再次点右边点按钮“添加JAR/文件夹”,添加”...hibernate-3.1/lib/“下面的所有jar文件。至此完成hibernate3.1.3库的添加,如下图。

 

 

3.断续上面第2步,新“hibernate3.1.x-annotation”库,过程和第2步基本一样,不过只要添加两个jar包:.../hibernate-annotations-3.1.0.Beta10/hibernate-annotations.jar 和 hibernate-jpa-2.0-api-1.0.0.Final.jar。如下图:

 

 

4.库创建完了之后新建一个测试项目,我建的项目名为“JA01”。添加已经建立好的库: hibernate3.1.3和hibernate3.1.x-annotation, 另外为了连接数据库,再导入mysl jdbc驱动程序ja包,因为netbeans本身就带有,直接导入即可。然后按以下结构建立文件结构。

其中,log4j.properties直接复制../hibernate-3.1/etc目录下的文件过来。HibernateUtil.java直接复制.../hibernate-3.1/doc/reference/tutorial/src/util目录下的文件。不过为了读取hibernate.mysql.cfg.xml, 需要修改HibernateUtil.java的代码,如下:

package com.utils;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.hibernate.cfg.Configuration;public class HibernateUtil {    private static final SessionFactory sessionFactory;    static {        try {            <span style="color:#cc0000;">//sessionFactory = new Configuration().configure("/com/config/hibernate.mysql2.cfg.xml").buildSessionFactory();            sessionFactory = new AnnotationConfiguration().configure("/com/config/hibernate.mysql.cfg.xml").buildSessionFactory();</span>        } catch (Throwable ex) {            // Make sure you log the exception, as it might be swallowed            System.err.println("Initial SessionFactory creation failed." + ex);            throw new ExceptionInInitializerError(ex);        }    }    public static SessionFactory getSessionFactory() {        return sessionFactory;    }}


修改hibernate.mysql.cfg.xml内容如下:

<?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.dialect">org.hibernate.dialect.MySQLDialect</property>        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">123</property>                <!--c3p0连接器-->        <!--        <property name="hibernate.connection.provider_class">net.sf.hibernate.connection.C3P0ConnectionProvider</property>        -->        <!--最大连接数-->        <property name="hibernate.c3p0.max_size">20</property>         <!--最小连接数-->        <property name="hibernate.c3p0.min_size">1</property>         <!--连接数据连接多长时间就超时-->        <property name="hibernate.c3p0.timeout">120</property>         <!-- 指定连接池里最大缓存多少个Statement对象 -->        <property name="hibernate.c3p0.max_statements">100</property>         <!--连接空闲时长多久时(秒),检查连接是否有效-->        <property name="hibernate.c3p0.idle_test_period">120</property>         <!--连接超 过最大连接数时每次c3p0同时获得多少个连接-->        <property name="hibernate.c3p0.acquire_increment">2</property>        <!--测试连接是否有效-->        <property name="hibernate.c3p0.validate">true</property>        <!-- 根据需要自动操作数据库 -->        <property name="hbm2ddl.auto">none</property>        <!-- 显示Hibernate持久化操作所生成的SQL -->        <property name="show_sql">true</property>        <!-- 将SQL脚本进行格式化后再输出-->         <!--<property name="hibernate.format_sql">true</property>-->                <!--把注解放入session-factory中-->        <mapping class="com.project.mapping.BlogAreaMapping"/>        </session-factory></hibernate-configuration>

BlogAreaMapping.java内容如下:

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package com.project.mapping;import javax.persistence.Entity;import javax.persistence.EntityResult;import javax.persistence.Id;import javax.persistence.SqlResultSetMapping;/** * * @author lcs * @Email 1125271180@qq.com */@Entity@SqlResultSetMapping(name = "BlogAreaMapping", entities = {@EntityResult(entityClass = BlogAreaMapping.class)})public class BlogAreaMapping {        @Id    private long fid;    private String name;    private int sons;    /**     * @return the fid     */    public long getFid() {        return fid;    }    /**     * @param fid the fid to set     */    public void setFid(long fid) {        this.fid = fid;    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    /**     * @return the sons     */    public int getSons() {        return sons;    }    /**     * @param sons the sons to set     */    public void setSons(int sons) {        this.sons = sons;    }    }


主程序JA01.java内容:

package ja01;import com.project.mapping.BlogAreaMapping;import com.utils.HibernateUtil;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;/** * * @author Administrator */public class JA01 {    /**     * @param args the command line arguments     */    public static void main(String[] args) {        Session session = HibernateUtil.getSessionFactory().openSession();        Transaction tx = session.beginTransaction();        List list = session.createSQLQuery("SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10").setResultSetMapping("BlogAreaMapping").list();        tx.commit();        session.close();                if ( list.size() > 0 ) {            for(int i = 0; i < list.size(); i++) {                BlogAreaMapping blogAreaMapping = (BlogAreaMapping) list.get(i);                System.out.println("fid:" + blogAreaMapping.getFid() + " -- name:" + blogAreaMapping.getName());                            }        }        // TODO code application logic here        System.out.println("ja 你好。");    }}


在mysql里(用户名root, 密码123)新建一个数据库glweb,编码设为bgk, 新建表gl_blog_area表的sql语句如下,测试数据可以自行录入:

SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for gl_blog_area-- ----------------------------DROP TABLE IF EXISTS `gl_blog_area`;CREATE TABLE `gl_blog_area` (  `fid` mediumint(7) unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(200) NOT NULL DEFAULT '',  `sons` smallint(4) NOT NULL DEFAULT '0'  PRIMARY KEY (`fid`)) ENGINE=MyISAM AUTO_INCREMENT=538 DEFAULT CHARSET=gbk;

 

以上工作都做完成后,就可以直接运行"JA01.java"进行测试了,测试结果如下:

run:12:18:58,037  INFO Version:15 - Hibernate Annotations 3.1.0.Beta10b12:18:58,053  INFO Environment:479 - Hibernate 3.1.312:18:58,053  INFO Environment:509 - hibernate.properties not found12:18:58,053  INFO Environment:525 - using CGLIB reflection optimizer12:18:58,053  INFO Environment:555 - using JDK 1.4 java.sql.Timestamp handling12:18:58,115  INFO Configuration:1308 - configuring from resource: /com/config/hibernate.mysql.cfg.xml12:18:58,115  INFO Configuration:1285 - Configuration resource: /com/config/hibernate.mysql.cfg.xml12:18:58,318  INFO Configuration:1419 - Configured SessionFactory: null12:18:58,365  INFO AnnotationBinder:336 - Binding entity from annotated class: com.project.mapping.BlogAreaMapping12:18:58,396  INFO EntityBinder:324 - Bind entity com.project.mapping.BlogAreaMapping on table BlogAreaMapping12:18:58,427  INFO ResultsetMappingSecondPass:51 - Binding resultset mapping: BlogAreaMapping12:18:58,474  INFO C3P0ConnectionProvider:50 - C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk12:18:58,474  INFO C3P0ConnectionProvider:51 - Connection properties: {user=root, password=****}12:18:58,474  INFO C3P0ConnectionProvider:54 - autocommit mode: false12:18:59,160  INFO SettingsFactory:77 - RDBMS: MySQL, version: 5.6.15-log12:18:59,160  INFO SettingsFactory:78 - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.23 ( Revision: ${bzr.revision-id} )12:18:59,160  INFO Dialect:103 - Using dialect: org.hibernate.dialect.MySQLDialect12:18:59,160  INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)12:18:59,176  INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)12:18:59,176  INFO SettingsFactory:125 - Automatic flush during beforeCompletion(): disabled12:18:59,176  INFO SettingsFactory:129 - Automatic session close at end of transaction: disabled12:18:59,176  INFO SettingsFactory:136 - JDBC batch size: 1512:18:59,176  INFO SettingsFactory:139 - JDBC batch updates for versioned data: disabled12:18:59,176  INFO SettingsFactory:144 - Scrollable result sets: enabled12:18:59,176  INFO SettingsFactory:152 - JDBC3 getGeneratedKeys(): enabled12:18:59,176  INFO SettingsFactory:160 - Connection release mode: auto12:18:59,176  INFO SettingsFactory:184 - Maximum outer join fetch depth: 212:18:59,176  INFO SettingsFactory:187 - Default batch fetch size: 112:18:59,176  INFO SettingsFactory:191 - Generate SQL with comments: disabled12:18:59,176  INFO SettingsFactory:195 - Order SQL updates by primary key: disabled12:18:59,176  INFO SettingsFactory:338 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory12:18:59,176  INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory12:18:59,176  INFO SettingsFactory:203 - Query language substitutions: {}12:18:59,176  INFO SettingsFactory:209 - Second-level cache: enabled12:18:59,176  INFO SettingsFactory:213 - Query cache: disabled12:18:59,176  INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider12:18:59,192  INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled12:18:59,192  INFO SettingsFactory:237 - Structured second-level cache entries: disabled12:18:59,192  INFO SettingsFactory:257 - Echoing all SQL to stdout12:18:59,192  INFO SettingsFactory:264 - Statistics: disabled12:18:59,192  INFO SettingsFactory:268 - Deleted entity synthetic identifier rollback: disabled12:18:59,192  INFO SettingsFactory:283 - Default entity-mode: pojo12:18:59,207  INFO SessionFactoryImpl:154 - building session factory12:18:59,223  WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/Frameworks/JAVA/Hibernate/3.1.x/hibernate-3.1/lib/ehcache-1.1.jar!/ehcache-failsafe.xml12:18:59,379  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configuredHibernate: SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10fid:1 -- name:北京市fid:2 -- name:上海市fid:3 -- name:天津市fid:4 -- name:重庆市fid:5 -- name:河北省fid:6 -- name:山西省fid:7 -- name:内蒙古自治区fid:8 -- name:辽宁省fid:9 -- name:吉林省fid:10 -- name:黑龙江省ja 你好。成功构建 (总时间: 1 秒)


这样基本完工了。

 

注意事项:

1.hibernate.mysql.cfg.xml中, 把<property name="hbm2ddl.auto"/>设置为none, 这是因为我所做的映射在数据库中这些表本来就不存在,所以不必要新建一个。在这个例子中,如果把值设置为update或者update,那么数据库里就会新建一个新的"blogareamapping"的表。这样做有点风险,那就是如果不小心这个数据库中"xxxxxxxxmapping"表本来就存在,而程序又要新建或更新一个这样的表,那很容易造成数据丢失。

2.运行结果里有一大堆INFO信息, 这个在开发时很有用,但放入到项目中,就不必要显示那么多了。为了不显示这些不必要的信息,可以修改log4j.properties文件, 把该文件中的“log4j.logger.org.hibernate=info”这行,改为“log4j.logger.org.hibernate=error”。这样就不显示info信息了,只显示error信息

 

0 0
原创粉丝点击