解:
在配置文件中有指定自动生成数据表的策略:
<property name="hbm2ddl.auto">update</property>
而在Mysql数据库中引擎engine = InnoDB,即本身支持事务。那么,在hibernate 设定的
时候就无需再指定了。如果指定则会发生错误。
如果Mysql 数据库的设定是不支持事务的话,那么指定方言:
org.hibernate.dialect.MySQL5InnoDBDialect,hibernate就会自动创建支持事务的表。
即 <!-- hibernate 所使用的数据库方言 -->
<property
name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
2. 建表时发生错误:alter table Order
drop
foreign key FK48E972E19D16493
Hibernate:
alter table Order
drop
foreign key FK48E972E19D16493 ....
解:
由于在建表的时候存在Order表,而order又是mysql的关键字,故会产生错误。详情
可在该网站 https://stackoverflow.com/questions/15337679/hibernate-unsuccessful-
alter-table 上查阅,问题与我的相似。
3. 能建表,但不能将数据插入(后刷新发现数据插入成功,此时生成数据表的策略为update)。
错误如下:org.hibernate.service.UnknownServiceException: Unknown service
requested [org.hibernate.stat.spi.StatisticsImplementor]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService
(AbstractServiceRegistryImpl.java:126)
at org.hibernate.internal.SessionFactoryImpl.getStatisticsImplementor
(SessionFactoryImpl.java:1480)
at org.hibernate.internal.SessionFactoryImpl.getStatistics
(SessionFactoryImpl.java:1476)
at org.hibernate.internal.SessionImpl.close(SessionImpl.java:348)
at com.hibernate.helloWorld.HibernateTest.destory(HibernateTest.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall
(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run
(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively
(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunAfters.evaluate
(RunAfters.java:33)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild
(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild
(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run
(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:192)
当数据表的生成策略改为 create 时,控制台出现
org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete -- hibernate 发出sql 语句时的成功显示
JUite 出现的问题没变。
总结上述问题:即能建表,能插入数据,但Juite 还是报了上述的错误。
解:
原因在于先关闭了sessionFactory 的对象再关session 的对象,故而发生该错误。
即错误的代码如下:
sessionFactory.close();
session.close();
正确做法调转上述语句顺序即可。