[英]Hibernate MySQL Cant create table
Im learning hibernate and i got stuck at the very beginning. 我正在学习休眠状态,一开始我就陷入了困境。 So the problem is that my app cant auto-create table.
所以问题是我的应用无法自动创建表。 Here goes all the code:
这是所有代码:
hibernate.cfg.xml hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">1</property>
<property name="hibernate.hbm2dll.auto">create</property>
<property name="hibernate.show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="azaro.test.hibernate.UserDetails" />
</session-factory>
</hibernate-configuration>
HibernateTest.java HibernateTest.java
package azaro.test.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateTest {
public static void main(String[] args) {
UserDetails user = new UserDetails();
user.setUserId(1);
user.setUserName("First User");
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}
}
UserDetails.java UserDetails.java
package azaro.test.hibernate;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class UserDetails {
@Id
private int userId;
private String userName;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
And the console output: 和控制台输出:
Hibernate: insert into UserDetails (userName, userId) values (?, ?)
Sep 23, 2013 6:34:23 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1146, SQLState: 42S02
Sep 23, 2013 6:34:23 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table 'hibernatedb.userdetails' doesn't exist
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3067)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3509)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:286)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at azaro.test.hibernate.HibernateTest.main(HibernateTest.java:23)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hibernatedb.userdetails' doesn't exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
... 14 more
If you need more info, feel free to ask. 如果您需要更多信息,请随时询问。
Check the ddl that is generated using 检查正在使用生成的DDL
SchemaExport(cfg).create(true, true);
Using this you will know the ddl and can analyze better. 使用此方法,您将了解ddl并可以进行更好的分析。 Also if schema is already updated.
同样,如果架构已经更新。 Set hbm2ddl.auto to 'create-drop'
将hbm2ddl.auto设置为'create-drop'
You have an error in the cfg.xml
file. cfg.xml
文件中有错误。 Change hbm2 dll to hbm2 ddl in 更改hbm2 DLL来hbm2在DDL
"hibernate.hbm2dll.auto">create
Then life will be beautiful again. 然后生活将再次美丽。 I know this because I made the same mistake and spent some hours to figure it out.
我知道这一点是因为我犯了同样的错误,花了几个小时才弄清楚。
添加配置文件(hibernate.cfg.xml)更新并使用@Column批注在databse中创建列
The 'SQLGrammarException' exception means the wrong syntax has written while the configuration of dialect. “ SQLGrammarException”异常表示在配置方言时编写了错误的语法。
Sep 23, 2013 6:34:23 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table 'hibernatedb.userdetails' doesn't exist
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
~~~~~~~~~~~~
Answer:
- The correct dialect entry is: [<property name="hibernate.dialect">]
~~~~~~~~~~
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
~~~~~~~~~
- The given is found from your XML file. [<property name="dialect">]
~~~~~~~~~
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="azaro.test.hibernate.UserDetails" />
</session-factory>
</hibernate-configuration>
~~~~~~~~~~~
Root Cause: The hibernate property should start with the 'hibernate.' prefix!
In this case, your code contains the property with the "dialect" prefix and this is wrong. Replace it with the "hibernate.dialect".
- Sarfaraz
Please try org.hibernate.dialect.MySQL5InnoDBDialect
instead of org.hibernate.dialect.MySQLDialect
请尝试使用
org.hibernate.dialect.MySQL5InnoDBDialect
而不是org.hibernate.dialect.MySQLDialect
MySQL5Dialact refers to the MyISAM storage type and the MySQL5InnoDBDialect the InnoDB (newer) type. MySQL5Dialact引用MyISAM存储类型,而MySQL5InnoDBDialect引用InnoDB(更新)类型。
do not initiate the user to null and configure hbm2ddl as create-drop, the code will execute with the result as follows: 不要初始化用户为null并将hbm2ddl配置为create-drop,代码将执行,结果如下:
Hibernate: insert into USER_DETAILS (Address, description, joinedDate, userName, userId) values (?, ?, ?, ?, ?) Hibernate: select userdetail0_.userId as userId1_0_0_, userdetail0_.Address as Address2_0_0_, userdetail0_.description as descript3_0_0_, userdetail0_.joinedDate as joinedDa4_0_0_, userdetail0_.userName as userName5_0_0_ from USER_DETAILS userdetail0_ where userdetail0_.userId=? 休眠:插入到USER_DETAILS(地址,描述,jointedDate,用户名,用户名)值(?,?,?,?,?)休眠:选择userdetail0_.userId作为userId1_0_0_,userdetail0_.Address作为地址2_0_0_,userdetail0_.description作为descript3_0_0_0,userdetail0_ .joinedDate作为joinDa4_0_0_,userdetail0_.userName作为来自USER_DETAILS userdetail0_的userName5_0_0_,其中userdetail0_.userId =?
user name retreived isfirst user 检索到的用户名是第一个用户
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.