今天早上五点多钟才上床睡觉,也不知道几点才睡着,我的下半身几乎没有感觉了!无限的痛苦啊!!!
还好得到了一点回报,我的第一个hibernate终于成功运行了!!!让我高兴的是我没有在任何人的指导下完全靠自己完成的!自学的成果啊!哈哈!能不高兴吗!
以前学struts时候是老师教的,学起来觉的很轻松,但我这次自己学这个hibernate让我感到了什么叫痛苦!什么叫无耐啊!曾在CSDN这个什么叫中国最大的IT社区论坛上发过问贴!还给了分做报酬!我等了两天就一个人给我回贴!我晕啊!这样的问题我不相信没人碰到过啊!也难怪那听说老手是很少上论坛的!不说那个什么CSDN了没用!
自学的过程就不说了只有痛苦的!但结果是开心的!和老师教相比的话花的时间是后者的最少5倍!用的精力是后者的10倍!!!虽说是累了点时间长了点!但是得到的体会还是不少的!
下面的是我从网上找的给了我不少帮助!下面的强例建议用第二种连接方式!!!如果你用了第一种在hibernate下会抛出很让人郁闷的异常!这不能怪你要怪只能怪bill,哈哈
用Java连接SQL Server2000数据库有多种方法,下面介绍其中最常用的两种(通过JDBC驱动连接数据库)。
1.
通过Microsoft的JDBC驱动连接。此JDBC驱动共有三个文件,分别是mssqlserver.jar、msutil.jar和msbase.jar,可以到微软的网站去下载(http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B138-2AA54BFDC03A&displaylang=en),如果你下载的是setup.exe,还需要安装它,安装后会生成上面的三个jar文件。此JDBC驱动实现了
JDBC 2.0。
驱动程序名称:com.microsoft.jdbc.sqlserver.SQLServerDriver
数据库连接URL:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname
2. 通过JTDS JDBC Driver连接SQL Server数据库,此驱动的文件名为jtds-1.2.jar,下载路径为(http://sourceforge.net/project/showfiles.php?group_id=33291),此驱动支持Microsoft
SQL Server (6.5, 7.0, 2000 和2005) 和Sybase,并且实现了JDBC3.0,是免费的。
驱动程序名称:net.sourceforge.jtds.jdbc.Driver
数据库连接URL:jdbc:jtds:sqlserver://localhost:1433/dbname
以下是常见的一些异常
1问:Hibernate初始化时总是报错:java.lang.NoClassDefFoundError
Hibernate初始化时出现出错代码:
java.lang.NoClassDefFoundError:
net/sf/ehcache/CacheException
答:这是新手常见问题。是因为使用默认设置时,Hibernate文档里指出的Hibernate库不完整,缺少ehcache.jar(用于支持Ehcache的相关文件)。配置中加入以上文件,就可以避免初始化时出现java.lang.NoClassDefFoundError:net/sf/ehcache/CacheException异常。
2问:Hibernate报错:"Not binding factory to JNDI, no JNDI
name configured"
运行下列程序:
public static void main(String[] args) throws
Exception {
Configuration conf = new
Configuration().addClass(Person.class);
......
出现错误码:
12:15:34,250 INFO SessionFactoryObjectFactory:82 -
Not binding factory to JNDI, no JNDI name configured
java.lang.UnsupportedOperationException: The user
must supply a JDBC connection
at
net.sf.Hibernate.connection.UserSuppliedConnectionProvider.getConnection
(UserSuppliedConnectionProvider.java:32)
at
net.sf.Hibernate.impl.BatcherImpl.openConnection(BatcherImpl.java:289)
at
net.sf.Hibernate.impl.SessionImpl.connect(SessionImpl.java:3361)
at
net.sf.Hibernate.impl.SessionImpl.connection(SessionImpl.java:3321)
at
net.sf.Hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:66)
at
net.sf.Hibernate.loader.Loader.prepareQueryStatement(Loader.java:779)
at
net.sf.Hibernate.hql.QueryTranslator.iterate(QueryTranslator.java:864)
at
net.sf.Hibernate.impl.SessionImpl.iterate(SessionImpl.java:1618)
at
net.sf.Hibernate.impl.QueryImpl.iterate(QueryImpl.java:27)
at
com.Hibernate.person.TestQueryPerson.main(TestQueryPerson.java:28)
Exception in thread "main"
答:修改main函数,为该程序指定配置文件即可。
public static void main(String[] args) throws
Exception {
File file=new File("./Hibernate.cfg.xml");
Configuration conf = new
Configuration().configure(file);
......
配置文件如下。
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://Hibernate.sourceforge.net/Hibernate-mapping-3.0.dtd">
3问:使用开发工具Elipse,运行时总报java.lang.NoClassDefFoundError:
org/ Hibernate/Session异常
使用Elipse,所用包是hibernte 3,发现在Action中每次执行到:
session=HibernateSessionFactory.currentSession();
时,出现java.lang.NoClassDefFoundError:
org/Hibernate/Session异常,如下:
java.lang.NoClassDefFoundError:
org/Hibernate/Session
Hibernate3.Hibernate.ExcuteClass.search(ExcuteClass.java:17)
Hibernate3.Hibernate.ExcuteClass.test3(ExcuteClass.java:13)
Hibernate3.Hibernate.Svlt.doGet(Svlt.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)[/b]
答:这是初学者常见问题,原因是没有导入hibernate 3.jar包,虽然把hibernate
3.jar写入了Classpath,但部署的时候却没有拷贝到lib下面,可以手动拷贝进入。
4问:执行如下方法时,发生"No CurrentSessionContext
configured"错误
执行如下方法时,发生"No CurrentSessionContext
configured"错误:
Public static Session currentSession() {
try {
System.out.println("HibernateUtil.currentSession() - start");
return
getSessionFactory().getCurrentSession();
} catch (HibernateException ex) {
System.out.println("HibernateUtil.currentSession() - failed due to " +
ex);
throw ex;
}
}
答:这个错误是由配置文件引起。在集成Hibernate的环境下(例如Jboss),在session-factory段加入:
jta
在不集成Hibernate的环境下(例如使用JDBC的独立应用程序),在session-factory段加入:
thread
就可以解决这个问题。
5问:移植Jboss 4下配置Hibernate出错
在Tomcat 5下配置Hibernate成功,但移植到Jboss
4下出现了很多问题。已在deploy目录下放置了Hibernate-service.xml和Hibernate.cfg.xml文件,但启动服务器仍然报错
如下。
16:56:54,046 ERROR [URLDeploymentScanner] Incomplete
Deployment listing:
Packages waiting for a deployer:
org.Jboss.deployment.DeploymentInfo@24bd343 {
url=file:/C:/Downloads/temp/Jboss-
4.0.0/server/default/deploy/Hibernate.cfg.xml }
deployer: null
status: null
state: INIT_WAITING_DEPLOYER
watch:
file:/C:/Downloads/temp/Jboss-4.0.0/server/default/deploy/Hibernate.cfg
.xml
altDD: null
lastDeployed: 1113987414046
lastModified: 1113987414046
mbeans:
Incompletely deployed packages:
org.Jboss.deployment.DeploymentInfo@24bd343 {
url=file:/C:/Downloads/temp/Jboss-
4.0.0/server/default/deploy/Hibernate.cfg.xml }
deployer: null
status: null
state: INIT_WAITING_DEPLOYER
watch:
file:/C:/Downloads/temp/Jboss-4.0.0/server/default/deploy/Hibernate.cfg
.xml
altDD: null
lastDeployed: 1113987414046
lastModified: 1113987414046
mbeans:
答:这是在Jboss中使用Hibernate的常见问题。在Jboss的某个war包中使用Hibernate应该将Hibernate.cfg.xml文件放置到%war_dir%WEB-INF/classes中,但是Hibernate的factory仍然可能会提示Hibernate.cfg.xml
not found。此问题解决方法如下。
由于Jboss已经集成了Hibernate,在deploy\lib文件夹中hibernate2.jar的文件已经存在了一个jar包,所以实际的war中可能使用了shar的hibernate2.jar,由于ClassLoader只会在hibernate2.jar的同级及上级目录中寻找hibernate.cfg.xml,所以导致Hibernate并没有去查找%war_dir%WEB-INF/classes中的Hibernate.cfg.xml文件。删除deploy/lib下的hibernate2.jar或者使用绝对路径指定Hibernate.cfg.xml可以解决。
除非有其他需求,否则在Jboss下部署Hibernate与在Tomcat下是一样的,并不需要加其他配置文件。
6问:到底在哪里使用cascade="..."?
答:cascade属性并不是多对多关系一定要用的,用了它只是插入或删除对象时更方便一些,只要在cascade的源头上插入或删除,所有cascade的关系就会被自动插入或删除。其中unsaved-value是个很重要的属性,Hibernate是通过这个属性来判断这个对象应该“save”还是“update”,如果这个对象的id是unsaved-value,那说明这个对象不是persistence
object,要save(insert);如果id是非unsaved-value,那说明这个对象是persistence
object(数据库中已存在),只要update就行了。
7问:到底在哪里使用inverse="true"
答:inverse属性默认是false,就是说关系的两端都来维护关系。这个意思就是说,如有3个表:Student、Teacher和TeacherStudent,Student对象和Teacher对象是多对多关系,这个关系由TeacherStudent表来表现。
那么什么时候插入或删除TeacherStudent表中的记录呢。用Hibernate时,不会显式的对TeacherStudent表操作,对TeacherStudent的操作是Hibernate自动做的。Hibernate就是hbm文件中指定的是“谁”维护关系,在插入或删除时,就会触发对关系表的操作。前提是“谁”这个对象已经知道这个关系,就是说关系另一头的对象已经set或是add到“谁”这个对象里来。
前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会触发对表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,就代表关系是由另一端维护的(Teacher)。就是说当插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有Teacher插入或删除时才会触发对关系表的操作。所以,关系的两头都用inverse="true"是不对的,会导致任何操作都不触发对关系表的操作。当两端都是inverse="false"或是default值时,在代码中对关系显式的维护也是不对的,会导致在关系表中插入两次关系。
8问:Cascade和Inverse有什么区别?
答:可以这样理解,Cascade定义的是关系两端对象到对象的级联关系;而Inverse定义的是关系和对象的级联关系。
9问:在删除操作时报错:net.sf.Hibernate.ObjectDeletedException:deleted
object would be re-saved by cascade (remove deleted object from
associations)
答:要删除关系的一头时(如,要删除一个已经和Student对象有关联的Teacher对象),当tx.commit()时才会抛出这个异常。防止出现这个异常的方法如下。
在Student端不用cascade。
或是用cascade的话,就显式的删除对像中的关系。
在Teacher端要用cascade。
10问:出现net.sf.Hibernate.HibernateException:
identifier of an instance of my. MyObject altered from N to N异常
答:这个异常不是多对多关系中常遇到的,但是这个异常的提示容易让人混淆。这是因为在Java对象中,id定义和hbm文件的不一样。如Java中用long,而hbm中用type=
"integer"。
11问:为什么在向数据库中插入长字符串时候部分自动丢失
在向数据库中增加一条新的条目时,发现如果文字(有英文字母,也有汉字)数量特别大,超过1000个,则每次通过Hibernate,向一个String类型的字段中增加数据时,只有几百个字可以增加进去,其他的自动丢失了。
答:这是由于字段长度设置不合理造成的。可以根据字符串实际长度考虑使用Text、LongText、或者Blob等字段类型。不同数据库的字段类型稍有不同,可以参考相关手册。另外需要注意的是一个汉字占用两个字节长度。
12问:为什么采用Hibernate的批量删除方法来删除大批量的记录数据时速度特别慢
答:在使用Hibernate版本2.X时,不推荐采用Hibernate的批量删除方法来删除大量记录。原因是,Hibernate会执行1条查询语句,另外还有满足条件的多条删除语句,而不是一次执行一个删除语句,所以当待删除的数据很多时,会有很大的性能瓶颈。而对于Hibernate
3.0以上的版本,则不存这个问题。
13问:升级Hibernate 3后在导入hbm映射文件时为什么非常非常慢
原先在Hibernate 2中,程序的速度是非常快的。当环境顺利从Hibernate
2升级到Hibernate 3后,发布时在Tomcat的控制台中发现:Hibernate
3装载hbm映射文件时非常慢,差不多10秒钟才能装载一个hbm文件。
答:通过在Hibernate的源代码中设置断点,可以发现执行效率低下的代码在org.hibernate.cfg.Configuration文件中的第240行:
addInputStream( new FileInputStream( xmlFile )
);
而addInputStream函数中又包含:
org.dom4j.Document doc = xmlHelper.createSAXReader(
"XML InputStream", errors, entityResolver ).read( new InputSource(
xmlInputStream ) );
跟踪org.hibernate.util.XMLHelper中的函数createSAXReader可以得出结论,问题的症结出在这一条语句:
org.dom4j.Document doc =
xmlHelper.createSAXReader()
可以判断这是在XML文件装载初始化时发生的错误,仔细检查XML文件,可以发现这是XML的第一行声明dtd的错误,因为以前使用的是Hibernate
2,所以hbm文件的dtd指向的是版本2,而升级Hibernate 3后,没有把老的hbm映射文件换成版本3。在更换为3版本后,此问题得到解决。
14问:为什么Hibernate 3中的HQL无法查询汉字
使用同样的代码和配置文件,在Hibernate 2上完全没有问题,在Hibernate
3中,使用如下HQL查询,无法得到正确的结果集:
String hql = "from story where title like
'%汉字%'";
Query q = session.createQuery(hql);
但用下面的HQL查询,却可以得到正确结果集:
String hql = " from story where title like
'%english%'";
Query q = session.createQuery(hql);
答:如果采用的是拼接HQL的方式,从Hibernate 2升级到Hibernate
3确实会出现汉字乱码问题。在控制台中可以看到,SQL的汉字部分变成了乱码:
[DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL -
"select story0_.content from story as story0_ where story0_.title like
'%&–°é—&&`¨&'
在Hibernate中,查询时应尽量使用占位符的写法(如下),这样既可以避免乱码问题,又可以避免潜在的SQL注入攻击:
getHibernate().find("from story where title like ?
", "%汉字%")
15问:Hibernate 3中如何获得库表所有字段的名称
答:可以使用以下的程序获得。
Configuration conf = new Configuration();
conf.configure();
Iterator iter =
conf.getTableMappings();
while ( iter.hasNext() ) {
Table table = (
Table ) iter.next();
System.out.println(table.getName());
Iterator ics =
table.getColumnIterator();
while
(ics.hasNext()){
Column
col = (Column) ics.next();
System.out.println(col.getName());
}
}
16问:错误代码:ObjectNotFoundException: No row with the
given identifier exists
答:在以下几种情况下,该错误可能会发生。
当试图使用session.load()方法装载一个未被代理的对象,或者访问一个超出范围的代理对象时。
当装载一个未被正确取得的映射时。
当未被外键约束的外键字段中含有非法值时。
检查装载使用的主键Id,并验证外键关系,以确定数据库中已经存在相应的约束关系。坚持“在一个Session中只处理一个事务”的原则。因为当在单一Session中使用多个事务时很容易犯错。尤其注意,在一个HibernateException已经抛出后不要再操作Session。
17问:错误代码:InvalidObjectException: Could not find a
SessionFactory named: null
答:这个错误在以下几种情况下经常发生。
试图序列化一个已经失效的Hibernate
Session,然后在另外一个虚拟机中进行反序列化。
类装载器被重置,例如在未重启的application server或者Web
container中重新部署程序。在使用Tomcat时会经常遇到这个问题,这是因为application
server中一般使用JNDI来存储SessionFactory,而在Tomcat或其他一些Web容器中,则是通过在context重载时,关闭HttpSession序列化来实现的。这种实现方式会引起这个错误发生。
18问:错误代码:org.hibernate.HibernateException: CGLIB
Enhancement failed:
答:Hibernate
3的默认方式是把所有类通过代理方式来进行延迟加载。如果代码中的类有一个私有无参的构造器的话,Hibernate将无法在运行时将项目代码中的类作为子类装载。为了避免这个错误,类中的构造器函数至少应该在包内可见。
19问:为什么在Hibernate中添加、删除、修改一个对象或Collection,但是数据库中实际上没有任何变化
答:这个问题经常会困扰初学者。这是因为如果没有使用Hibernate的自动事务处理,则必需显式的提交事务,操作才会在数据库中执行。
20问:为什么保存一个父对象,而它的关联对象没有自动储存到数据库里
答:关联对象必需显式的调用session.save()(或session.persist()),或者在关联的映射文件中加入cascade="all"或cascade="save-update"(或cascade="persist")才能够自动关联执行。
相关推荐
**标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...
标题“菜鸟快速运行第一个hibernate”表明了这是一个针对初学者的教程,旨在帮助他们快速上手并成功运行他们的第一个Hibernate项目。Hibernate是一个强大的Java ORM(对象关系映射)框架,它简化了数据库操作,使得...
在本文中,我们将深入探讨如何创建Hibernate的第一个例子,帮助初学者快速入门。** **一、Hibernate 简介** Hibernate 提供了丰富的API,简化了Java应用程序与关系数据库之间的交互。它通过XML配置文件或注解来定义...
个人的第一个hibernate例子,下载后添加表,修改数据库连接,用户名密码即可使用。 参考网址: https://blog.csdn.net/yerenyuan_pku/article/details/64209343
# Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的...
【hibernate第一个例子】 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本示例将引导初学者了解如何使用Hibernate进行简单的数据库连接和操作。 首先,我们需要...
这个例子是学习Hibernate的基础,它展示了如何使用Hibernate进行基本的数据操作。随着对Hibernate的深入学习,还可以掌握更复杂的功能,如级联操作、懒加载、缓存机制以及实体关系映射等。理解并熟练运用Hibernate,...
【我的第一个Hibernate程序】这篇文章是关于初学者如何创建并运行第一个Hibernate程序的详细教程。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的编程,简化了数据...
Hibernate 是一个开源的O/R mappimg的框架,基于JDBC...另外还有两个东东,一个是class2hbm,与第一个相反,是根据class来导出映射文件的。还有一个ddl2hbm,是根据数据库来导出表结构,并生成映射文件和POJO class。
**标题:Hibernate经典例子全** **内容:** Hibernate是一款强大的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而无需过多关注底层的SQL语句。本资源包含了一系列的Hibernate实例,旨在...
通过这个例子,我们可以看到Hibernate如何将Java对象和数据库表进行映射,以及如何执行CRUD操作,同时理解了配置、事务处理、关联和缓存等关键概念。在实际项目中,根据需求,还可以探索更高级的功能,如 Criteria ...
在这个"android hibernate demo例子"中,开发者可能使用了一个特殊的方法或者第三方库来使Hibernate在Android上运行。 这个"OrmDemo"项目包含以下关键组件: 1. **实体类(Entity Classes)**:这些是与数据库表...
在这个例子中,我们将深入探讨Hibernate的基本概念、配置、实体类的创建、映射文件的编写以及Session接口的使用。下面将详细阐述相关知识点。 1. Hibernate简介: Hibernate是一个开源的对象关系映射(ORM)框架,...
《Hibernate入门:初识与实践》 ...总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。通过实践,你可以逐步熟悉ORM思想,为后续的Java开发奠定坚实的基础。
这个例子可能是通过创建一个简单的Java项目,然后引入Spring和Hibernate的相关库,配置相应的XML文件,以及编写对应的Java代码来展示集成过程。 描述中提到的“博文链接:https://xwhoyeah.iteye.com/blog/517879”...
Hibernate提供了缓存机制,包括第一级缓存(Session级别)和第二级缓存(SessionFactory级别)。第一级缓存默认启用,自动管理对象的状态;第二级缓存可选,用于提高性能,但需注意并发问题。 ### 八、总结 通过...
最后,从列表中取出第一个元素并打印其`name`和`pwd`属性值,表明查询操作成功完成。 二、删除(Delete) 删除操作用于从数据库中移除指定的记录。示例代码如下: ```java Session session = Hibernate...
通过上述步骤,我们可以在Eclipse环境下成功构建并运行第一个Hibernate应用程序。使用Hibernate框架,不仅可以提高开发效率,减少重复性的编码工作,还能提升代码的可读性和可维护性。对于初学者而言,掌握Hibernate...
在测试中,通常会使用`@Transactional`注解确保每个测试方法都在一个独立的事务中运行。 5. **查询(Querying)**: JPA 提供了JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL。此外...
【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...