你的位置:首页 > Java教程

[Java教程]maven学习(二)


  晚上在eclipse上安装了m2eclipse插件,然后使用maven创建了一个小项目测试了一下,但是测试的时候出现了几个问题,现在简单总结一下:

项目是添加hibernate支持,然后使用junit测试添加一条数据。

项目结构如下:

看到这个结构大家可能会奇怪为什么测试的资源包中也有hibernate的配置文件,

这要是我要说的第一个问题junit测试的时候如果测试资源包中没有hibernate的配置文件,那么maven就报错,说找不到hibernate的配置文件

如下所示:

java.lang.ExceptionInInitializerError  at lizm.pro.user.dao.UserDao.<init>(UserDao.java:11)  at lizm.pro.user.dao.TestUserDao.testAdd(TestUserDao.java:13)  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  at java.lang.reflect.Method.invoke(Method.java:606)  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)  at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)  at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)  at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  at java.lang.reflect.Method.invoke(Method.java:606)  at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)  at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)  at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)  at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)  at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)Caused by: org.hibernate.HibernateException: /hibernate.cfg.173)  at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:2095)  at org.hibernate.cfg.Configuration.configure(Configuration.java:2076)  at org.hibernate.cfg.Configuration.configure(Configuration.java:2056)  at lizm.pro.user.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:13)  at lizm.pro.user.util.HibernateUtil.<clinit>(HibernateUtil.java:10)  ... 31 more

问了下度娘,度娘给的最好的解决办法就是在测试的资源包中也加入hibernate的配置文件

 

 

问题二、mysql包的版本问题

  在楼主千辛万苦终于把找不到hibernate配置文件的问题解决以后,以为可以愉快的和maven玩耍了,谁知道又出现了第二个问题,第二个问题是这个样子的:

Hibernate: insert into _user (cnname, passWord, userName) values (?, ?, ?)org.hibernate.exception.GenericJDBCException: could not execute statement  at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)  at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)  at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032)  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558)  at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98)  at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:492)  at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:197)  at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:181)  at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:216)  at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:334)  at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:289)  at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:195)  at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)  at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)  at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)  at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)  at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)  at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)  at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)  at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)  at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)  at lizm.pro.user.dao.UserDao.add(UserDao.java:19)  at lizm.pro.user.dao.TestUserDao.testAdd(TestUserDao.java:15)  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  at java.lang.reflect.Method.invoke(Method.java:606)  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)  at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)  at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)  at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  at java.lang.reflect.Method.invoke(Method.java:606)  at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)  at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)  at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)  at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)  at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)Caused by: java.sql.SQLException: Could not retrieve transation read-only status server  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:904)  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:894)  at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3613)  at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3582)  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2111)  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2081)  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2066)  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)  ... 52 moreCaused by: java.sql.SQLException: Unknown system variable 'tx_read_only'  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835)  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771)  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2531)  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2489)  at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1446)  at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3607)  ... 57 more

SQL语句是出来了,但是没有测试成功,开始还以为是事务提交搞错了,但是仔细一看是JDBC异常,肯定跟事务没什么亲戚了,所以就继续问度娘这个异常是什么鬼,然后就看到多位大神的回答是包的版本问题,一看我的mysql包,我去,是最新的,5点多的啊,这个怎么会有问题呢?心想是不是我的问题跟人家的不一样啊,抱着试一试的态度把mysql的包换成了3点多,一试竟然成功了。

  开始使用maven的时候还为能使用最新的JAR包而兴奋,现在想想还真不是那么回事,使用新的东西是没错,但是稳定版本可能更好 吧,所以以后就不用最新的,但是也要使用尽可能新的版本