hirhibernate的关系映射 映射关系问题

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
关系映射技术在.NET开发中的应用
下载积分:290
内容提示:关系映射技术在.NET开发中的应用
文档格式:PDF|
浏览次数:0|
上传日期: 05:09:59|
文档星级:
该用户还上传了这些文档
关系映射技术在.NET开发中的应用
官方公共微信3660人阅读
在Spring+hebernate中 Cannot get a connection, pool
error Timeout waiting for idle object异常的解决办法
&& 最近写了个留言板,tomcat+Spring+hibernate+MyEclipse
使用jdbc连接数据库所有功能都没问题,发布到tomcat中也没问题,可是如果使用tomcat的数据源,来连接数据库,开始很正常,但是刷新几次就会出现这个异常&&
22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0,
SQLState: null
& 22:35:40,812 ERROR
[org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error
Timeout waiting for idle object
& 22:35:40,812 WARN
[org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null
& 22:35:40,812 ERROR
[org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error
Timeout waiting for idle object
& 22:35:40,812 ERROR [com.dao.MessageDAO]
- find all failed
&org.springframework.jdbc.UncategorizedSQLException:
Hibernate operation: Ca uncategorized SQLException for SQL
[???]; SQL state [null]; error code [0]; Cannot get a connection, pool error
Timeout wai nested exception is
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool
error Timeout waiting for idle object
Caused by:
org.apache.tomcat.dbcp.dbcp.SQLNestedException:
Cannot get a connection, pool error Timeout waiting for idle object
org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection
(LocalDataSourceConnectionProvider.java:81)
org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)
org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
org.hibernate.loader.Loader.doQuery(Loader.java:661)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
org.hibernate.loader.Loader.doList(Loader.java:2145)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
org.hibernate.loader.Loader.list(Loader.java:2024)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:832)
& &&&&&&&&
开始弄了半天也不知道怎么回事,后来发现是我自己写的分页代码有问题&&原来的代码如下:
&&& &* 自定义的,用属性模糊查询
&&& public List find(String propertyName, Object
&&&&&&& log.debug(&finding Message instance with
property: & + propertyName
&&&&&&&&&&&&& + &, value: & + value);
&&&&&&& try {
&&&&&&&&&& String queryString = &from Message as
model where model.&
&&&&&&&&&& &&& &&& &&& &&& &&& &&& + propertyName +
& like &+value+& order by model.time desc&;&&&&&&&&&&
& &&& &&& &return
getHibernateTemplate().find(queryString);
&&&&&&& } catch (RuntimeException re) {
&&&&&&&&&& log.error(&find by property name failed&,
&&&&&&&&&&
&&&& * 自定义的方法,获取指定页的数据
&&& public List gotoPage(int page,int pageSize){
&&& &&& int totItem =
this.findAll().size();//记录总条数
&&& &&& int pageNum = totItem / pageSize
+1;//总页数
&&& &&& int begin = 0;//当前起始记录数
&&& &&& begin=page*pageSize-pageSize+1;
//计算当前起始位置
&&& &&& Session s =this.getSession();
&&& &&& String hql = &from Message message order by
message.time desc&;
&&& &&& Query q =s.createQuery(hql);
&&& &&& q.setFirstResult(begin);
&&& &&& q.setMaxResults(pageSize);&& &&&
&&& &&& return q.list();
在这句中: Session s =this.getSession();
&&& &&& String hql = &from Message message order by
message.time desc&;
&&& &&& Query q =s.createQuery(hql);
查询数据时,Spring并不能够自动管理连接,也就是说,在使用中这几句代码重视不段的获取数据库的连接,每调用一次就申请一个连接&&直到
tomcat连接池中的连接耗尽&&所以就再也申请不到连接了&&出现了这个异常,解决办法是使用事务来管理这段代码,让Spring自动管理这段代码中申请的连接。我使用了Spring
AOP自动事务代理&&配置文件如下&&
来自JNDI的tomcat数据源,有连接池。但是用起来怎么就释放不了连接呢?程序只知道申请,不知道释放! --&
&&& &bean id=&JndiDataSource&
class=&org.springframework.jndi.JndiObjectFactoryBean&&
&&& &&& &property name=&jndiName&&
&&& &&& &&&
&value&java:comp/env/SqlServer&/value&
&&& &&& &/property&
&&& &&& &property name=&resourceRef&&
&&& &&& &&& &value&true&/value&
&&& &&& &/property&
&&& &/bean&
&&& &!-- hibernate的会话工厂 --&
&&& &bean id=&sessionFactory&
class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&
&&& &&& &property name=&dataSource&&
&&& &&& &&& &ref
bean=&JndiDataSource&&&/ref&
&&& &&& &/property&
&&& &&& &property
name=&hibernateProperties&&
&&& &&& &&& &props&
&&& &&& &&& &&& &prop
key=&hibernate.dialect&&
&&& &&& &&& &&& &&&
org.hibernate.dialect.SQLServerDialect
&&& &&& &&& &&& &/prop&
&&& &&& &&& &&& &!-- 显示SQL,为了方便测试 --&
&&& &&& &&& &&& &prop
key=&hibernate.show_sql&&true&/prop&
&&& &&& &&& &/props&
&&& &&& &/property&
&&& &&& &property name=&mappingResources&&
&&& &&& &&& &list&&!-- 映射文件 --&
&&& &&& &&& &&&
&value&./Message.hbm.xml&/value&
&&& &&& &&& &&&
&value&./Setting.hbm.xml&/value&
&&& &&& &&& &&&
&value&./Admin.hbm.xml&/value&
&&& &&& &&& &/list&
&&& &&& &/property&
&&& &/bean&
&&& &!-- 事务管理器 --&
&&& &bean id=&transactionManger&
class=&org.springframework.orm.hibernate3.HibernateTransactionManager&&
&&& &&& &property name=&sessionFactory&&
&&& &&& &&& &ref bean=&sessionFactory& /&
&&& &&& &/property&
&&& &/bean&
&&& &!--&& 配置事务拦截器--&
&&& &bean id=&transactionInterceptor&
class=&org.springframework.transaction.interceptor.TransactionInterceptor&&
&&& &&& &property
name=&transactionManager&&
&&& &&& &&& &ref bean=&transactionManger&
&&& &&& &/property&
&&& &&& &!--&& 下面定义事务传播属性--&
&&& &&& &property
name=&transactionAttributes&&
&&& &&& &&& &props&
&&& &&& &&& &&& &prop
key=&find*&&PROPAGATION_REQUIRED&/prop&
&&& &&& &&& &&& &prop
key=&delete*&&PROPAGATION_REQUIRED&/prop&
&&& &&& &&& &&& &prop
key=&save*&&PROPAGATION_REQUIRED&/prop&
&&& &&& &&& &&& &prop
key=&merge*&&PROPAGATION_REQUIRED&/prop&
&&& &&& &&& &&& &prop
key=&attach*&&PROPAGATION_REQUIRED&/prop&&&& &&& &&& &&&
&&& &&& &&& &&& &prop
key=&gotoPage&&PROPAGATION_REQUIRED&/prop&
&&& &&& &&& &/props&
&&& &&& &/property&
&&& &/bean&
&&& &!--& 自动代理 --&
&&& &bean id=&autoBeanNameProxyCreator&
class=&org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator&&
&&& &&& &property name=&beanNames&&
&&& &&& &&& &list&
&&& &&& &&& &&& &value&*DAO&/value&&&&
&&& &&& &&
&&& &&& &&& &&&
&value&gotoPage&/value&
& && && &&& &&& &value&find&/value&
&&& &&& &&& &/list&
&&& &&& &/property&
&&& &&& &property name=&interceptorNames&&
&&& &&& &&& &list&
&&& &&& &&& &&& &idref
local=&transactionInterceptor& /&
&&& &&& &&& &/list&
&&& &&& &/property&
&&& &&& &!--& 这里的配置是必须的,否则无法完成代理的类型转化
&&& &&& 这是使用CGLIB来生成代理
&&& &&& --&
&&& &&& &property name=&proxyTargetClass&
value=&true&/&
&&& &/bean&
&&& &bean id=&MessageDAO&
class=&com.dao.MessageDAO&&
&&& &&& &property name=&sessionFactory&&
&&& &&& &&& &ref
bean=&sessionFactory&&&/ref&
&&& &&& &/property&
&&& &/bean&
&&& &bean id=&SettingDAO&
class=&com.dao.SettingDAO&&
&&& &&& &property name=&sessionFactory&&
&&& &&& &&& &ref
bean=&sessionFactory&&&/ref&
&&& &&& &/property&
&&& &/bean&
&&& &bean id=&AdminDAO&
class=&com.dao.AdminDAO&&
&&& &&& &property name=&sessionFactory&&
&&& &&& &&& &ref
bean=&sessionFactory&&&/ref&
&&& &&& &/property&
&&& &/bean&
OK,问题成功解决!
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20587次
排名:千里之外
评论:15条
(1)(2)(3)(1)(1)hebernate_映射jpa注释理解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
hebernate_映射jpa注释理解
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩9页未读,继续阅读
你可能喜欢hiabernate&中createQuery与createSQLQuery区别,使用经验
hiabernate 中createQuery与createSQLQuery区别,使用经验
createQuery与createQuery两者区别是:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query =
session.createSQLQuery(sql).addEntity(XXXXXXX.class);
代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
呵呵以后多注意,还是时不时的要看看hibernate各个对象方法的使用。
还有另外一个相关的小细节应注意:
比如有这样一个po
PO: User.class
properties: userId,userName
DDL: create table tuser (userid varchar(10),username
varchar(20));
& & session.createQuery("from
User u").list()时生成的SQL:
  select userid,
session.createQuery("from User u").iterator()时生成的SQL:
可以看出list()一次将数据从中读出直接填充到List中
iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行:
select userid,username from user where userid=?;把数据读出。
在不同的应用范围使用不同的方法,具体在hibernate应用中应当注意。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Hibernate的简介和Hinbernate的简单模拟实现
Hibernate的出现和Hinbernate的简单模拟实现
日,继续学习Hibernate框架
Hibernate是一种免费的开源的Java语言下的对象关系映射解决方案
Hibernate 有个在.NET Framework 上的实现版本,称为 NHibernate
1.1 & 为什么出现Hibernate
l &阻抗不匹配
l &如果有对象,hibernate就没用了
1.2 & Hibernate在做什么
l &查询、加载
体系结构图
1.3 & 优点
l &sql语句不用写了,只需要操纵对象,使开发更对象化
l &移植性好
l &提高开发效率
l &透明持久化,不需要实现任何类,任何接口。Pojo类没有实现任何第三方的接口。即没有侵入性
l &轻量级的框架,不依赖于容器
1.4 & 缺点
l &额外的学习成本
l &配置麻烦
l &复杂的查询效率不高,
l &批量修改、删除效率不高
l &大量数据的查询效率不高
1.5 & 使用场合
l &不想写sql
l &需要跨平台。
1.6 & 不宜使用的场合
l &实体关系太复杂
l &需要数据库的特定优化机制
l &需要使用存储过程
l &批量更新,批量删除不适合
Hibernate的模拟实现
1. 创建项目:Hibernate_OR_Mapping_Simulation
2. 创建包:com.wwj.hibernate.model
3. &创建Student类
/Student.java
package com.wwj.hibernate. &
&* @author wwj&
&* Student模型类&
public class Student { &
& & private S &
& & public int getId() { &
& & public void setId(int id) { &
& & & & this.id = &
& & public String getName() { &
& & public void setName(String name) { &
& & & & this.name = &
& & public int getAge() { &
& & public void setAge(int age) { &
& & & & this.age = &
4. 创建包Test
5. 创建Test类
import com.wwj.hibernate.model.S &
&* @author wwj&
public class Test { &
& & public static void main(String[] args) throws Exception{ &
& & & & Student stu = new Student(); & &//定义一个Student类对象 &
& & & & //设置属性值 &
& & & & stu.setId(3); & & & & & & & & & &&
& & & & stu.setName(&lishi&); &
& & & & stu.setAge(22); &
& & & & &&
& & & & //生成自定义的Session对象 &
& & & & Session session = new Session(); &
& & & & //执行Session类中的save方法 &
& & & & session.save(stu); &
6. 创建Session类
import java.lang.reflect.M &
import java.sql.C &
import java.sql.DriverM &
import java.sql.PreparedS &
import java.util.HashM &
import java.util.M &
import com.wwj.hibernate.model.S &
&* 模拟Hibernate中的Session实现的功能&
&* @author wwj&
&* @date &&
public class Session { &
& & String tableName = &student&; & //表名 &
& & Map&String,String& cfs = new HashMap&String, String&(); //字段名与属性一一对应的关系 &
& & String[] methodN & & & //声明一个字符串数组,用来存储方法名 &
& & &* Session的构造方法&
& & public Session(){ &
& & & & cfs.put(&id&, &id&); &
& & & & cfs.put(&name&, &name&); &
& & & & cfs.put(&age&, &age&); &
& & & & &&
& & & & methodNames = new String[cfs.size()]; & &&
& & &* 实现数据插入功能&
& & &* @param stu&
& & &* @throws Exception&
& & public void save(Student stu) throws Exception{ &
& & & & String sql = createSql(); & & & //获取拼接完成的sql语句 &
& & & & &&
& & & & Class.forName(&com..jdbc.Driver&); & & & & //加载MySQL数据库驱动 &
& & & & //获取数据库连接 &
& & & & Connection conn = DriverManager.getConnection(&jdbc:mysql://localhost/hibernate&,&root&, &wwj&); &
& & & & //创建PreparedStement对象 &
& & & & PreparedStatement ps = conn.prepareStatement(sql); &
& & & & &&
& & & & for(int i = 0; i & methodNames. i++) { &
& & & & & & //利用Java的反射机制,获取对象的方法 &
& & & & & & Method m = stu.getClass().getMethod(methodNames[i]); & & &
& & & & & & Class r = m.getReturnType(); & &//获取方法返回值类型 &
& & & & & & if(r.getName() == &java.lang.String&){ &//如果返回值类型等于&java.lang.String&的话 &
& & & & & & & & String v = (String)m.invoke(stu); & //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 &
& & & & & & & & ps.setString(i + 1, v); & & & & & & //将指定参数设置为给定 Java String 值。 &
& & & & & & } &
& & & & & & if(r.getName() == &int&){ & & & &&
& & & & & & & & Integer v = (Integer)m.invoke(stu); &
& & & & & & & & ps.setInt(i + 1, v); &
& & & & & & } &
& & & & & & System.out.println(m.getName() + &|& + r.getName()); &
& & & & } &
& & & & ps.executeUpdate(); & & & & //执行sql语句更新数据库 &
& & & & ps.close(); & & & & & & & & //释放此PrepareStatement对象的数据库和JDBC资源 &
& & & & conn.close(); & & & & & & & //关闭数据连接 &
& & &* 创建SQL语句&
& & &* @return&
& & private String createSql() { &
& & & & &&
& & & & //拼接字段 &
& & & & String str1 = &&; &
& & & & int index = 0; &
& & & & for(String s : cfs.keySet()) { &
& & & & & & String v = cfs.get(s); &
& & & & & & v = Character.toUpperCase(v.charAt(0)) + v.substring(1); &
& & & & & & methodNames[index] = &get& + &
& & & & & & index++; &
& & & & & & str1 += s + &,&; &&
& & & & } &
& & & & str1 = str1.substring(0, str1.length() - 1); & & & &//去掉最后面的逗号&,& &
& & & & System.out.println(str1); &
& & & & //拼接(?,?,?,?),问号的个数取决于map的长度 &
& & & & String str2 = &&; &
& & & & for(int i = 0; i & cfs.size(); i++){ &
& & & & & & str2 += &?,&; &
& & & & } &
& & & & str2 = str2.substring(0, str2.length() - 1); &
& & & & System.out.println(str2); &
& & & & &&
& & & & //拼接sql字符串 &
& & & & String sql = &Insert into & + tableName + &(& + str1 + &)& + &values& + &(& + str2 + &)&; &
& & & & System.out.println(sql); &
& & & & &&
测试结果:
id,age,name
Insert into student(id,age,name)values(?,?,?)
getAge|int
getName|java.lang.String}

我要回帖

更多关于 hibernate 视图映射 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信