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信息
- Hibernate3.1.3使用自定义实体类实现对SQL查询语句的映射
- 使用SQL查询语句映射到对象实体的方法汇总
- Hibernate3.6中用Annotation来实现实体类与数据库表的映射关系
- 利用自定义的SQL语句生成类代替实体类的使用
- hibernate查询SQL语句返回自定义实体对象
- hibernate查询SQL语句返回自定义实体对象
- hibernate查询SQL语句返回自定义实体对象
- Hibernate之使用sql语句查询多个表,返回多种字段,将返回结果映射到自定义的普通pojo类中
- Hibernate使用sql语句查询,返回实体类型的方法及注意事项
- spring JPA中对自定义实体的查询经验
- SQL查询语句的使用
- hibernate3.6finald的Annotation实现实体类与数据库表的映射关系(不再需要hibernate-annotations.jar hibernate-commons-annota)
- 对sql查询语句组合查询的通用实现算法(c++版,java版)
- hibernate将sql或hql查询结果集映射为实体类 不需要映射文件
- Hibernate 执行SQL语句查询实体
- hibernate sql语句查询返回非受管实体
- java实现从实体到SQL语句的转换
- MyEclipse2014 使用 hibernate3.jar 生成数据库实体类和xml map映射文件 (补16年12月)
- Mac和Xcode一些快捷键
- wpf 打开外部程序并在需要时激活
- 黑马程序员——最全的iOS Objective-C面试题及答案(1)——黑马 ios 技术博客
- hdu4310 Hero (贪心)
- Java编程最差实践
- Hibernate3.1.3使用自定义实体类实现对SQL查询语句的映射
- vi 全局替换命令等
- iOS开发-定位服务和地理围栏
- Apache Commons 工具类介绍及简单使用
- Sicily 1636. show me the money
- 右位移循环操作的实现
- 控件源码网站
- iOS开发 FTP使用详解
- nyoj-214 单调递增子序列(二)