【问题标题】:Hibernate MySQL Cant create tableHibernate MySQL 无法创建表
【发布时间】:2013-09-23 14:44:20
【问题描述】:

我正在学习休眠,一开始我就卡住了。所以问题是我的应用程序无法自动创建表。全部代码如下:

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

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

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;
    }

}

还有控制台输出:

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

如果您需要更多信息,请随时询问。

【问题讨论】:

  • 您是否创建了架构?当hibernate没有创建数据库时,我遇到了这种问题,更改为update,尝试先运行“create database hibernateb”然后运行你的代码。 .
  • Schema 已创建,问题是如果我自己在该数据库中创建表,我的应用程序会将对象放入其中。也试过更新,结果一样。
  • 然后尝试修改您的实体,将表名添加到您的实体注释中,并添加您字段的其余列(@Column)..
  • 没有改变:@Table(name="UserDetails", schema="hibernatedb"), @Column(name="ID", unique=true), @Column(name="Name")

标签: java mysql hibernate


【解决方案1】:

检查使用

生成的ddl
SchemaExport(cfg).create(true, true);

使用它您将了解 ddl 并可以更好地进行分析。此外,如果架构已经更新。将 hbm2ddl.auto 设置为 'create-drop'

【讨论】:

  • 所有相同的例外。
  • AnnotationConfiguration() 没有帮助并且已弃用:(
  • 您能否尝试检查模式导出选项并分析 hibernate 用于创建模式的 ddl 脚本。即添加以下行以在控制台的 new SchemaExport(cfg).create(true, true); 中获取 ddl;
  • 另外,如果架构已经创建,我想您需要将其更改为“create-drop”,以便休眠删除以前的架构并再次创建
  • 哇,帮了大忙!我在 configuration.configure(); 之后添加了您的行现在它的工作! ddl is - 如果存在则删除表 hibernateb.UserDetails 创建表 hibernateb.UserDetails(ID 整数不为空,名称 varchar(255),主键 (ID))ENGINE=InnoDB
【解决方案2】:

cfg.xml 文件中有错误。在

中将hbm2dll改为hbm2ddl
"hibernate.hbm2dll.auto">create

然后生活将再次美丽。 我知道这一点是因为我犯了同样的错误并花了几个小时 想办法。

【讨论】:

    【解决方案3】:

    在配置文件(hibernate.cfg.xml)中添加更新并使用@Column注解在数据库中创建列

    【讨论】:

      【解决方案4】:

      “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
      

      【讨论】:

        【解决方案5】:

        请尝试org.hibernate.dialect.MySQL5InnoDBDialect 而不是org.hibernate.dialect.MySQLDialect

        MySQL5Dialact 指的是 MyISAM 存储类型,MySQL5InnoDBDialect 指的是 InnoDB(较新的)类型。

        【讨论】:

        • 改变方言没有帮助:(
        【解决方案6】:

        不要初始化用户为null,将hbm2ddl配置为create-drop,代码执行结果如下:

        Hibernate:插入 USER_DETAILS(地址、描述、joinedDate、userName、userId)值(?、?、?、?、?) Hibernate:选择userdetail0_.userId作为userId1_0_0_,userdetail0_.Address作为Address2_0_0_,userdetail0_.description作为descript3_0_0_,userdetail0_.joinedDate作为joinedDa4_0_0_,userdetail0_.userName作为userName5_0_0_ from USER_DETAILS userdetail0_ where userdetail0_.userId=?

        检索到的用户名是第一个用户

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-16
          • 2017-10-23
          • 1970-01-01
          • 2015-05-23
          • 1970-01-01
          • 2017-03-05
          • 2017-04-02
          相关资源
          最近更新 更多