我是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();
}
}
答案 0 :(得分:17)
您应尝试使用其他方言,例如org.hibernate.dialect.MySQL5Dialect
或org.hibernate.dialect.MySQLMyISAMDialect
或org.hibernate.dialect.MySQLInnoDBDialect
,以查看哪种方言适合您。
总而言之,您当前的方言在create table query中生成type=MyISAM
,ENGINE=MyISAM
。create table MyTable (id integer not null, name varchar(255), primary key (id)) 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)
您遇到此错误的原因可能是以下任何原因:-
我遇到此错误是因为我在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 解决了这个问题,并创建了表。