您的位置:首页 > 数据库

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

2014-12-21 11:55 591 查看
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.Beta10b
12:18:58,053  INFO Environment:479 - Hibernate 3.1.3
12:18:58,053  INFO Environment:509 - hibernate.properties not found
12:18:58,053  INFO Environment:525 - using CGLIB reflection optimizer
12:18:58,053  INFO Environment:555 - using JDK 1.4 java.sql.Timestamp handling
12:18:58,115  INFO Configuration:1308 - configuring from resource: /com/config/hibernate.mysql.cfg.xml
12:18:58,115  INFO Configuration:1285 - Configuration resource: /com/config/hibernate.mysql.cfg.xml
12:18:58,318  INFO Configuration:1419 - Configured SessionFactory: null
12:18:58,365  INFO AnnotationBinder:336 - Binding entity from annotated class: com.project.mapping.BlogAreaMapping
12:18:58,396  INFO EntityBinder:324 - Bind entity com.project.mapping.BlogAreaMapping on table BlogAreaMapping
12:18:58,427  INFO ResultsetMappingSecondPass:51 - Binding resultset mapping: BlogAreaMapping
12:18:58,474  INFO C3P0ConnectionProvider:50 - C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk
12:18:58,474  INFO C3P0ConnectionProvider:51 - Connection properties: {user=root, password=****}
12:18:58,474  INFO C3P0ConnectionProvider:54 - autocommit mode: false
12:18:59,160  INFO SettingsFactory:77 - RDBMS: MySQL, version: 5.6.15-log
12: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.MySQLDialect
12: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(): disabled
12:18:59,176  INFO SettingsFactory:129 - Automatic session close at end of transaction: disabled
12:18:59,176  INFO SettingsFactory:136 - JDBC batch size: 15
12:18:59,176  INFO SettingsFactory:139 - JDBC batch updates for versioned data: disabled
12:18:59,176  INFO SettingsFactory:144 - Scrollable result sets: enabled
12:18:59,176  INFO SettingsFactory:152 - JDBC3 getGeneratedKeys(): enabled
12:18:59,176  INFO SettingsFactory:160 - Connection release mode: auto
12:18:59,176  INFO SettingsFactory:184 - Maximum outer join fetch depth: 2
12:18:59,176  INFO SettingsFactory:187 - Default batch fetch size: 1
12:18:59,176  INFO SettingsFactory:191 - Generate SQL with comments: disabled
12:18:59,176  INFO SettingsFactory:195 - Order SQL updates by primary key: disabled
12:18:59,176  INFO SettingsFactory:338 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
12:18:59,176  INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory
12:18:59,176  INFO SettingsFactory:203 - Query language substitutions: {}
12:18:59,176  INFO SettingsFactory:209 - Second-level cache: enabled
12:18:59,176  INFO SettingsFactory:213 - Query cache: disabled
12:18:59,176  INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider
12:18:59,192  INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled
12:18:59,192  INFO SettingsFactory:237 - Structured second-level cache entries: disabled
12:18:59,192  INFO SettingsFactory:257 - Echoing all SQL to stdout
12:18:59,192  INFO SettingsFactory:264 - Statistics: disabled
12:18:59,192  INFO SettingsFactory:268 - Deleted entity synthetic identifier rollback: disabled
12:18:59,192  INFO SettingsFactory:283 - Default entity-mode: pojo
12:18:59,207  INFO SessionFactoryImpl:154 - building session factory
12: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.xml
12:18:59,379  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate: SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10
fid: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信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: