GenerationTarget遇到异常接受命令:通过JDBC语句执行DDL时出错

时间:2017-04-14 07:47:36

标签: java hibernate jpa jdbc spring-data

我是hibernate世界的新手,面对,

rv := reflect.ValueOf(u)
if rv.Kind() == reflect.Ptr {
    rv = rv.Elem()
}
if rv.Kind() == reflect.Struct {
    fmt.Println(rv.NumField())
}
当我在hibernate 5.2.9版本中运行我的独立程序时,

异常。但是在hibernate 4版本中我的代码运行良好。我找了很多问题并解决了,但没有得到答案。

  

配置文件

WARN: GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
  

的pom.xml

hibernate.cfg.xml

    <hibernate-configuration>
      <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">admin</property>
        <property name="hibernate.connection.pool_size">20</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">create</property>
        <mapping class="com.test.hibernate14417.MyTable"></mapping>
      </session-factory>
    </hibernate-configuration>
  

实用程序文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>Hibernate14417</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <repositories>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.9.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.1.Final</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.jtds</groupId>
            <artifactId>jtds</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>3.1.11</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>
  

实体文件

package com.test.hibernate14417;

import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;


public class ExecuteUtil {
    private static final SessionFactory SESSION_FACTORY=buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .configure("hibernate.cfg.xml").build();

            Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();

            return metadata.getSessionFactoryBuilder().build();

        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }

    }

    public static SessionFactory getSESSION_FACTORY() {
        return SESSION_FACTORY;
    }

    public static void shutdown(){
        getSESSION_FACTORY().close();
    }

}
  

主要方法

package com.test.hibernate14417;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;




@Entity
public class MyTable implements Serializable {

    @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



}
  

控制台

package com.test.hibernate14417;

import org.hibernate.Session;
import org.hibernate.SessionFactory;


public class Main {
    public static void main(String[] args) {

        MyTable mt=new MyTable();
        mt.setName("Man");

        SessionFactory sessionFactory=ExecuteUtil.getSESSION_FACTORY();

        Session session=sessionFactory.getCurrentSession();


        try {
          session.getTransaction().begin();

          session.save(mt);

          session.getTransaction().commit();

           session.close();
           sessionFactory.close();

        } catch (Exception e) {
            System.out.println(e.getStackTrace());
            session.getTransaction().rollback();
        }


    }

8 个答案:

答案 0 :(得分:17)

您应尝试使用其他方言,例如org.hibernate.dialect.MySQL5Dialectorg.hibernate.dialect.MySQLMyISAMDialectorg.hibernate.dialect.MySQLInnoDBDialect,以查看哪种方言适合您。

总而言之,您当前的方言在create table query中生成type=MyISAMENGINE=MyISAMcreate table MyTable (id integer not null, name varchar(255), primary key (id)) type=MyISAM

mysql error 'TYPE=MyISAM'

您也应该阅读此内容,Why do I need to configure the SQL dialect of a data source?

您的日志表示此查询已尝试执行{{1}},因此您应该尝试直接在mysql命令提示符下执行该查询,以查看它是否适用于您的MySQL版本。

另外,问题是指定你的MySQL版本。

希望它有所帮助!!

答案 1 :(得分:1)

更改hibernate配置XML文件。

  <!-- SQL dialect -->      
  <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

答案 2 :(得分:1)

您遇到此错误的原因可能是以下任何原因:-

  • DB脚本中的列名称与模型/实体类不同。
  • 配置文件中提及属性值时出现拼写错误。
  • MySQL版本与您提到的方言不匹配。

我遇到此错误是因为我在DATABASE SCRIPT中更改了列名,但忘记在Model / Entity类中进行更改。因此,经过4个小时的梳理,我只是简单地做到了,我的应用程序就开始运行。

答案 3 :(得分:0)

检查您的财产价值错误。

有时会发生这种情况,当你只是忘记 Dialec 中的't'时,必须是 Dialect ,只是拼写错误或在你的配置里面有一种错误。

答案 4 :(得分:0)

您正在使用MySQL的更新版本,但使用和 dialect

使用其中一个,

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

OR

<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>

hibernate.cfg.xml文件中。

这可以防止您遇到dialect个问题。

答案 5 :(得分:0)

我遇到了同样的问题。确实,这是方言问题,尽管Sabir提供的所有选项都没有(在适当的尊重下)帮助我,但将其从MySQL5Dialect更改为MySQL8Dialect可以帮助我解决问题。

因此,如果以上提供的上述3个选项都不起作用,请使用 MySQL8Dialect

希望这会有所帮助。

答案 6 :(得分:0)

当我尝试将Spring Boot应用程序连接到Google Cloud MySQL DB时,还有另一种对我有用的方言:i

答案 7 :(得分:0)

我遇到了同样的问题,我使用方言作为 MySqlDialect

我通过将方言更改为 org.hibernate.dialect.MySQL57Dialect 解决了这个问题,并创建了表。