此问题困扰笔者很久,希望能帮到一些初学者。
先不多说了,初学Hibernate框架写了一个Demo,结果一直运行不出来想要的结果。
先描述下环境:在eclipse中添加了Hibernate的插件,然后使用的是Hibernate-4.3.11版本。数据库使用的是MySQL5.5.28。在数据库中先创建好一个数据库名字叫:hibernate,里面没有任何东西。
下面首先贴出我的项目列表和文件代码,以及错误
以下是每个文件的具体代码
News.java文件代码如下
package com.hibernate.pojo;
import java.sql.Date;
public class News {
private Integer id;
private String title;
private String author;
private Date date;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public News(String title, String author, Date date) {
super();
this.title = title;
this.author = author;
this.date = date;
}
public News() {}
@Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", author=" + author
+ ", date=" + date + "]";
}
}
hibernate.cfg.xml文件代码如下:
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driverproperty>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernateproperty>
<property name="connection.username">rootproperty>
<property name="connection.password">rootproperty>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialectproperty>
<property name="hbm2ddl.auto">updateproperty>
<property name="show_sql">trueproperty>
<property name="format_sql">trueproperty>
<mapping resource="com/hibernate/pojo/News.hbm.xml" />
session-factory>
hibernate-configuration>
News.hbm.xml文件代码如下:
<hibernate-mapping package="com.hibernate.pojo" >
<class name="News" table="NEWS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
id>
<property name="title" type="java.lang.String">
<column name="TITLE" />
property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" />
property>
<property name="date" type="java.sql.Date">
<column name="DATE" />
property>
class>
hibernate-mapping>
HibernateTest.java文件代码如下:
package com.hibernate.test;
import java.sql.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import com.hibernate.pojo.News;
public class HibernateTest {
@Test
public void test() {
//1.获取sessionFactory
//a.获取hibernate的上下文对象
Configuration configuration = new Configuration().configure();
//b.通过上下文对象创建serviceRegistry对象
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
//c.获取sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//2.获取session
Session session = sessionFactory.openSession();
//3.开启事务
Transaction transaction = session.beginTransaction();
//4.执行逻辑
News news = new News("hibernate", "qinzhe", new Date(new java.util.Date().getTime()));
session.save(news);
//5.提交事务
transaction.commit();
//6.关闭session
session.close();
//7.关闭sessionFactory
sessionFactory.close();
}
}
结果运行这个测试类报了以下错误:
十月 05, 2016 10:02:10 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
十月 05, 2016 10:02:10 下午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.11.Final}
十月 05, 2016 10:02:10 下午 org.hibernate.cfg.Environment
INFO: HHH000206: hibernate.properties not found
十月 05, 2016 10:02:10 下午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
十月 05, 2016 10:02:10 下午 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
十月 05, 2016 10:02:10 下午 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
十月 05, 2016 10:02:10 下午 org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
十月 05, 2016 10:02:10 下午 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: com/hibernate/pojo/News.hbm.xml
十月 05, 2016 10:02:10 下午 org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
十月 05, 2016 10:02:10 下午 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
十月 05, 2016 10:02:11 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
十月 05, 2016 10:02:11 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/hibernate]
十月 05, 2016 10:02:11 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=root, password=****}
十月 05, 2016 10:02:11 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
十月 05, 2016 10:02:11 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
十月 05, 2016 10:02:11 下午 org.hibernate.dialect.Dialect
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
十月 05, 2016 10:02:11 下午 org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
十月 05, 2016 10:02:11 下午 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
十月 05, 2016 10:02:11 下午 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
INFO: HHH000397: Using ASTQueryTranslatorFactory
十月 05, 2016 10:02:13 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
十月 05, 2016 10:02:13 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000102: Fetching database metadata
十月 05, 2016 10:02:13 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000396: Updating schema
十月 05, 2016 10:02:13 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: NEWS
十月 05, 2016 10:02:13 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: NEWS
十月 05, 2016 10:02:13 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: NEWS
十月 05, 2016 10:02:14 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: HHH000388: Unsuccessful: create table NEWS (ID integer not null auto_increment, TITLE varchar(255), AUTHOR varchar(255), DATE date, primary key (ID)) type=InnoDB
十月 05, 2016 10:02:14 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=InnoDB' at line 7
十月 05, 2016 10:02:14 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate:
insert
into
NEWS
(TITLE, AUTHOR, DATE)
values
(?, ?, ?)
十月 05, 2016 10:02:14 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1146, SQLState: 42S02
十月 05, 2016 10:02:14 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table 'hibernate.news' doesn't exist
十月 05, 2016 10:02:14 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning
WARN: SQL Warning Code: 1146, SQLState: 42S02
十月 05, 2016 10:02:14 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning
WARN: Table 'hibernate.news' doesn't exist
照理来说我写了以上代码,hibernate会自动帮我创建news表,并且插入一条数据的。结果总是报错说hibernate.news表不存在。
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialectproperty>
网上后来百度了一下org.hibernate.dialect.MySQLInnoDBDialect和org.hibernate.dialect.MySQLDialect 两个方言的区别,说MySQLDialect是兼容性方言,MySQLInnoDBDialect支持事务的方言版。但是如果数据库版本是5.5以下,就可以直接用,如果是5.5版本及以上,需要改成MySQL5InnoDBDialect。 结果马上cmd上去
mysql --version
一看版本是5.5.28。然后将数据库方言改为MySQL5InnoDBDialect。果然一切问题都解决了。