hibernate运行原理 配置到底是哪里出问题 Junit测试运行部了 求解

Spring+hibernate+junit的Dao测试
我的图书馆
Spring+hibernate+junit的Dao测试
下面分别讲解在Junit4.4和Junit3.8下如何写测试类。
对于Junit3.8:
Spring的DAO层的测试,spring-test.jar包里有个AbstractTransactionalDataSourceSpringContextTests类,只要继承它,然后重写getConfigLocations方法就可以了。比较简单,而且又支持回滚,没有数据库的耗时操作。
对于你所有的applicationContext.xml等spring配置文件,你都不用动。Eclipse默认的classpath路径是项目路径下的build/classes,注意不要被你的ant写的build覆盖了,而ant的build又没有编译test包。最终找不到测试类。
下面先写一个基本的测试类,其他的只要继承这个类并添加test方法即可。
import org.apache.commons.logging.L
import org.apache.commons.logging.LogF
import org.springframework.test.AbstractTransactionalDataSourceSpringContextT
public class BaseDaoTestCaseJunit3 extends
AbstractTransactionalDataSourceSpringContextTests {
protected final static Log log = LogFactory.getLog(BaseDaoTestCaseJunit3.class);&
protected String[] getConfigLocations(){
this.setAutowireMode(AUTOWIRE_BY_NAME);
return new String[]{"classpath:/applicationContext.xml","classpath:/spring-config-*.xml"};
public void testConfig() { & & & &
&& & & assertNotNull("spring-mock context has bean init()",this.applicationContext);
下面这个类继承自上面的BaseDaoTestCaseJunit3,只是测试了下CustInfoDao里面的findByEmail方法。
import com.psi.domain.CustI
public class CustInfoDaoTests3 extends BaseDaoTestCaseJunit3 {
private CustInfoDao ciD
private CustI
public CustInfoDaoTests3(){}
public void setCustInfoDao(CustInfoDao ciDao){
this.ciDao = ciD
public void getList(){
ci = ciDao.findByEmail("sue76543@ms5.url.com.tw"); //此方法直接返回对象.
assertNotNull(ci.getId());
}catch(Exception e){
e.printStackTrace();
下面讲讲Junit4.4的写法:
Junit4用了完全不同于Junit3的写法,它的配置文件等都只需要在annotation里标注即可。TransactionManager是你在application里配置的TransactionManager。
package com.psi.
import org.junit.runner.RunW
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import org.springframework.test.context.transaction.TransactionC
import org.springframework.transaction.annotation.T
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/applicationContext.xml","classpath:/spring-config-*.xml"})
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
@Transactional
public class BaseDAOTestCaseJunit44 {
//本类作为基类,所有要用到的东西都在annotation里配置了。所以什么内容都不用写了。
//Dao测试类继承自上面的基类,并添加了个测试方法findByEmail。
import static org.junit.Assert.*;
import org.junit.B
import org.junit.T
import org.springframework.beans.factory.annotation.A
import com.psi.domain.CustI
public class CustInfoDaoTests extends BaseDAOTestCaseJunit44 {
private CustInfoDao ciD
private CustI
public CustInfoDaoTests(){}
@Autowired
public void setCustInfoDao(CustInfoDao ciDao){
this.ciDao = ciD
public void init(){}
public void getList(){
ci = ciDao.findByEmail("sue76543@ms5.url.com.tw");
assertNotNull(ci.getId());
}catch(Exception e){
e.printStackTrace();
就这么简单,但是要注意要加载相应的包,Spring-test.jar, apache的commons-下的包最好都加上。(项目中你基本都能用上)
还要注意你的配置文件路径。
我还碰到过下面这个错误:
Caused by: java.lang.NullPointerException&&& at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)
这是Eclipse的Bug,它在测试环境下不能自动加载到SystemLibrary下的所有包,所以你需要将你的Library改成user-library即可。
[转]&[转]&[转]&
喜欢该文的人也喜欢hibernate不自动生成数据表 ,运行console中显示已经执行语句了,但是没自动建表?
[问题点数:20分,无满意结帖,结帖人saimer1220]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:0
本版专家分:7878
2017年8月 Java大版内专家分月排行榜第二2017年7月 Java大版内专家分月排行榜第二2017年6月 Java大版内专家分月排行榜第二2017年5月 Java大版内专家分月排行榜第二
本版专家分:1063
2017年6月 Java大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:7878
2017年8月 Java大版内专家分月排行榜第二2017年7月 Java大版内专家分月排行榜第二2017年6月 Java大版内专家分月排行榜第二2017年5月 Java大版内专家分月排行榜第二
本版专家分:0
本版专家分:7878
2017年8月 Java大版内专家分月排行榜第二2017年7月 Java大版内专家分月排行榜第二2017年6月 Java大版内专家分月排行榜第二2017年5月 Java大版内专家分月排行榜第二
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:2675
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:50
本版专家分:0
本版专家分:0
本版专家分:0
匿名用户不能发表回复!
其他相关推荐
myeclipse10
jdk 是1.7 tomcat版本是8
这是applicationContext.xml
xmlns:tx=&http://www.springframework.org/schema/tx& xmlns:cache=&http://www.springframework.org/schema/cache& xmlns:task=&http://w
1:只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表
update:表示自动根据model对象来更新表结构,启动hibernate时会自动检查数据库,如果缺少表,则自动建表;如果表里缺少列,则自动添加列(并且表中原来的数据不会丢失)(注:若表里有多余的列,则不会删除)。若对应类型不一致,则不会修改表的字段的类型,操作(如插入记录)失败(Consle无错
在Hibernate3.2版本之后,开始支持使用JPA注解来替代XML映射配置,极大程度的简化了hibernate的配置,现在使用注解也成为了映射的首选方式。
@Id注解:指定实体Bean的主键映射,需在getter方法上标注。@GeneratedValue注解:用于指定主键生成策略,注解支持的主键生成策略有:
AUTO——相当于配置文件中的native,根据底层数
使用的annotation ,在spring配置文件中配置了hbm2ddl.auto,发布正常,但就是没有自动建表,没有任何提示,搜了搜无意发现是很细节的问题。
org.hibernate.dialect.MySQLDialect
com.jifan.pssmis.model.bo.*
Hibernate第一次运行时报错:You have
an error in your SQL check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=MyISAM'
at line 1。
根据异常可以知道应该是MySQL的版
springmvc+hibernate5不能自动建表
单独使用hibernate时openSession()在没有使用spring控制事务时,使用的是sessionFactory.openSession()。这样每个方法都会新建一个session,必须在方法中控制和关闭session。于是一开始我直接在try-with-resource语句中使用session的update等方法,无任何事务,在单元测试时发现update方法和delete方法无效。解决
1、对与java项目,做数据库迁移时,都会用的数据脚本。
2、当引入hibernate时,可以创建数据库表的配置文件。可以根据表的配置文件自动在数据库建表。(数据库要预先建立好,因为hibernate只会建表,不会建库)
1)、在配置文件 hibernate.cfg.cml 中加入参数 ,配置相关数据源参数和pojo文件
com.mysql.jdbc.Drive
在学习李刚的《轻量级Java2EE企业应用实战 第三版》时,调试第一个Hibernate程序,源代码是HibernateQs,
根据书本和源码敲上去,经常几次调试排除了代码写错的原因,可是最终还是出错,于是直接拿源码运行(做了一
些基本的必要修改如数据库密码什么的),可是还是出现同样的错误,提示找不到“news_table”表。由于初学,没有
Hibernate开发经验,复制错误提示上百度找用junit测试Hibernate插入数据,在opensession时出现异常 source not found
<a data-traceid="question_detail_above_text_l&&
十一月 19, :27 下午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.2.Final}
十一月 19, :27 下午 org.hibernate.cfg.Environment &clinit&
INFO: HHH000206: hibernate.properties not found
十一月 19, :27 下午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
十一月 19, :28 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager &clinit&
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
十一月 19, :29 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
十一月 19, :29 下午 org.hibernate.service.internal.AbstractServiceRegistryImpl stopService
INFO: HHH000369: Error stopping service [class org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl] : java.lang.NullPointerException
因为已经是不同线程了吧?
--- 共有 1 条评论 ---
这个问题我没有搞明白是怎么回事。
我在google了一些回答,说是可能是JDK的问题,我就把我的8换成7了,然后就没出现过这个问题。
但我并不确定到底是JDK有问题,还是我的写法上面有问题。junit测试hibernate 4保存数据时出现java.lang.NullPointerException异常 - ITeye问答
框架采用的是:struts-2.3.1.2 + spring-framework-3.1.1 + hibernate-release-4.1.1
启动tomcate完全成功,没有任何错误提醒。
JUnit测试保存数据时异常提示如下:
java.lang.NullPointerException
at com.java.service.impl.AdminServiceImpl.save(AdminServiceImpl.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy10.save(Unknown Source)
at com.java.test.AdminServiceImplTest.testSave(AdminServiceImplTest.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
处理流程如下:
testSave方法调用AdminServiceImpl接口实现一个Admin对象的保存
Admin对象代码如下:
public class Admin {
private S
&&&&&&& 省略get set方法.......
}
Admin.hbm.xml映射配置如下:
&?xml version="1.0"?&
&!DOCTYPE hibernate-mapping PUBLIC
&&& "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
&&& "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&
&hibernate-mapping&
&&& &class name="com.java.model.Admin"&
&&&&&&& &id name="id" type="java.lang.Integer"&
&&&&&&&&&&& &generator class="native" /&
&&&&&&& &/id&
&&&&&&& &property name="name"/&
&&&&&&& &property name="pwd"/&
&&& &/class&
&/hibernate-mapping&
操作该类的接口AdminServiceImpl代码如下:
package com.java.service.
import java.util.L
import javax.annotation.R
import org.hibernate.SessionF
import org.springframework.transaction.annotation.T
import com.java.model.A
@Transactional
public class AdminServiceImpl implements AdminService {
public AdminServiceImpl(){};
/* 采用注解的方式*/
@Resource private SessionFactory sessionF
public void save(Admin Admin){
&&&&&&&&&&&&&&& System.out.println(Admin.Id());
System.out.println(Admin.getName());
System.out.println(Admin.getPwd());
sessionFactory.getCurrentSession().save(Admin);
}
测试类的代码如下:
package com.java.
import static org.junit.Assert.*;
import org.junit.BeforeC
import org.junit.T
import org.springframework.context.ApplicationC
import org.springframework.context.support.ClassPathXmlApplicationC
import com.java.model.A
import com.java.service.impl.AdminS
public class AdminServiceImplTest {
private static AdminService AdminS
@BeforeClass
public static void setUpBeforeClass() throws Exception {
ApplicationContext applicationcontext=new& ClassPathXmlApplicationContext("applicationContext.xml");
AdminService =(AdminService) applicationcontext.getBean("AdminServiceImpl");
public void testAdminServiceImpl() {
@Test& //只测试了保存
public void testSave() {
Admin admin=new Admin();
admin.setName("123");
admin.setPwd("qq123");
AdminService.save(admin);
}
}
数据库是sqlserver2008 数据库连接jar包也引了,映射文件也在applicationContext.xml配置了,用junit测试时老出现上面的提醒说在AdminServiceImpl的sessionFactory.getCurrentSession().save(Admin);处错误。
调试后发现id为空,但不是在Admin.hbm.xml配置了id的生成方式了吗?不明白为什么无法自动生成。
求高手解救!
问题补充:wangbiyu1213 写道不好意思 ,刚才回答有错 看错异常出现地方了 ,有可能是你的sesstionFactoy为空,应该不是admin这个对象的问题
谢谢你的回答 问题已解决:
的确最终原因不在我贴出的代码上而在于hibernate4的不成熟和配置的混乱。
网上查的说是Spring3对hibernate4的支持不是很好,而且hibernate4去除了HibernateDaoSupport的支持(我采用daoImpl继承HibernateDaoSupport的然后调用this.getHibernateTemplate()获取HibernateTemplate然后实现增删改查的),由于初学我的配置采用了xml和注解两种方式混杂,最终程序自己都混乱了。
最后我把jar包改为struts2+Spring3+hibernate3,配置全部采用xml,然后一路畅通,华华丽丽的就成功了。
最终还是谢谢你的回答!
不好意思 ,刚才回答有错 看错异常出现地方了 ,有可能是你的sesstionFactoy为空,应该不是admin这个对象的问题
AdminService =(AdminService) applicationcontext.getBean("AdminServiceImpl");
spring的实例名注解的话应该是小写的吧
AdminService =(AdminService) applicationcontext.getBean("adminServiceImpl");
这里的空是指你的AdminService为空。。。
还有变量开头一般用小写,这是规范啊
已解决问题
未解决问题用MyEclipse+struts+hibernate测试时遇到的问题
作者:用户
本文讲的是用MyEclipse+struts+hibernate测试时遇到的问题,
用MyEclipse+struts+hibernate测试时遇到的问题
由于工作原因,使用了MyEclipse+Struts1.2+Hibernate3.1+Spring2
用MyEclipse+struts+hibernate测试时遇到的问题
由于工作原因,使用了MyEclipse+Struts1.2+Hibernate3.1+Spring2.0框架写程序,刚开始的时候在Tomcat6.0上写,后来上面的领导非要弄到Resin3.0上,具体原因不清楚,没办法,照办吧。
把MyEclipse下自动生成的SSH结构直接发布到Resin3.0上,结果痛苦便开始了,弹出错误说什么
21:13:32,500 ERROR Digester:686 - Digester.getParser: org.xml.sax.SAXNotRecognizedException: http://apache.org/xml/features/validation/dynamic
at com.caucho.xml.parsers.XmlSAXParserFactory.setFeature(XmlSAXParserFactory.java:94)
at org.apache.commons.digester.parser.XercesParser.configureXerces(XercesParser.java:185)
at org.apache.commons.digester.parser.XercesParser.newSAXParser(XercesParser.java:138)
还有其他错误,总之就是xml解析异常,后来经过好多次试验总结后发现,如果单独部署Hibernate或Spring或Struts或Spring+Struts都是没有问题的,但只要把Hibernate加进来,就肯定会出Strtus的配置文件无法初始化的错误,后来研究了一下Hibernate项目添加进来的包文件,经过研究,把一下几个包从里面删除:
commons-collections-2.1.1.jar
与Struts加入的包功能重复
antlr-2.7.5H3.jar
与Struts加入的包功能重复
commons-logging-1.0.4.jar
与Struts加入的包功能重复
xerces-2.6.2.jar、xml-apis.jar
一套xml解析器
经过查阅无数的资料(当然了是通过Google和Baidu)得到如下结论
用 hibernate2 需要hibernate2.jar;用 hibernate3 需要 hibernate3.jar和antlr-2.7.5H3.jar
然后加入Struts1.2,
添加到Resin3.0中运行一下吧,看没问题。嘿嘿。。暂时没问题,
附录:Hibernate中不必要的类库
ant.jar和optional.jar
一个数据库连接池
proxool.jar
一个数据库连接池
commons-pool.jar, commons-dbcp.jar
DBCP数据库连接池,罗嗦啊,tomcat也有这个
connector.jar
JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。
JAAS是用来进行权限验证的,已经包含在JDK1.4里面了
如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用
jdbc2_0-stdext.jar
JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上
JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上
Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用
xalan.jar, xerces.jar, xml-apis.jar
Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。而且也是罪恶的根源,不定哪个有冲突了。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
数据库连接池
,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!

我要回帖

更多关于 hibernate5.1中文文档 的文章

 

随机推荐