org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错相关的知识,希望对你有一定的参考价值。
我真的需要帮助,我搜索了我在stackoverflow上发现的所有问题,但没有任何作用。我之前从未使用过hibernate而且我不知道我做错了什么。我生成了表格,但插入时我遇到了问题。
我收到此错误:
20-May-2017 10:53:41.085 WARN [http-nio-8080-exec-1] org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl.handleException GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:525)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:470)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyForeignKeys(AbstractSchemaMigrator.java:429)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:245)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:110)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:309)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:445)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
at gameplatform.servlet.IndexPage.init(IndexPage.java:46)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:779)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: Cannot add foreign key constraint
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455)
at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:839)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:739)
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
... 32 more
这是我的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:8889/gameplatform</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.pool_size">100</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="db.table.template.Permesso"/>
<mapping class="db.table.template.PermessoTemplate"/>
<mapping class="db.table.template.PermessoTemplateId"/>
<mapping class="db.table.template.Template"/>
<mapping class="db.table.template.Gruppo"/>
<mapping class="db.table.template.Utente"/>
<mapping class="db.table.template.Livello"/>
<mapping class="db.table.template.Gioco"/>
<mapping class="db.table.template.Giocare"/>
<mapping class="db.table.template.GiocareId"/>
<mapping class="db.table.template.Trofeo"/>
</session-factory>
</hibernate-configuration>
这是我的测试页面:
package gameplatform.servlet
public class TestPage extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestPage() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
Configuration conf = new Configuration().configure();
Session session = conf.buildSessionFactory().getCurrentSession();
session.beginTransaction();
Permesso permesso = new Permesso();
permesso.setNome("Index");
permesso.setIndirizzo("gameplatform.op");
Template template = new Template("slider.jsp");
session.saveOrUpdate(template);
PermessoTemplate permessoTemplate = new PermessoTemplate();
permessoTemplate.setPermesso(permesso);
permessoTemplate.setTemplate(template);
permessoTemplate.setPriority(3);
permesso.getPermessoTemplate().add(permessoTemplate);
session.saveOrUpdate(permesso);
Query query = session.createQuery("from Template template join template.permessoTemplate joinPage where joinPage.pk.permesso = 'Index' order by joinPage.priority");
List<Template> temp = query.list();
Iterator it = temp.iterator();
while (it.hasNext()) {
Object[] obj = (Object[]) it.next();
Template test = (Template) obj[0];
response.getWriter().append(" " + test.getIndirizzo());
}
Gruppo test = new Gruppo("Admin");
session.saveOrUpdate(test);
Utente user = new Utente("Romolo", "De Roma", 20, "Er Zezzo", "Prova", "test@test.it", 3000, 3);
user.setGruppo(test);
test.getUtente().add(user);
test.getPermesso().add(permesso);
session.saveOrUpdate(user);
/*Recensione recensione = new Recensione();
recensione.setDescrizione("Gioco Bello");
recensione.setVoto(4);
recensione.setUtente(user);
session.saveOrUpdate(recensione);*/
Query control = session.createQuery("from Livello");
List<Livello> controlList = control.list();
boolean bool = false;
Iterator iter = controlList.iterator();
while (iter.hasNext()) {
//Object[] obj = (Object[])
Livello lv = (Livello) iter.next();
if (lv.getLivello()==3 && lv.getUtente().getUsername().equals(user.getUsername())){
bool=true;
}
}
if (!bool){
Livello livello = new Livello();
livello.setLivello(3);
livello.setDate(new GregorianCalendar(2017,5,20));
livello.setUtente(user);
session.saveOrUpdate(livello);
}
Gioco gioco = new Gioco();
gioco.setNome("Zezzo");
gioco.setDescrizione("Bel Gioco Di Merda");
gioco.setSpecifiche("2Gb di Rom");
Giocare giocare = new Giocare();
giocare.setExp(3000);
giocare.setMinuti(new Time(2000));
giocare.setNumAccessi(30);
giocare.setRecensione("Bello ma Brutto");
giocare.setVoto(5);
giocare.setUtente(user);
giocare.setGioco(gioco);
gioco.getGiocare().add(giocare);
session.saveOrUpdate(gioco);
Trofeo trofeo = new Trofeo();
trofeo.setNome("Test");
trofeo.setIcona("icona.jpg");
trofeo.setObiettivo(5);
trofeo.setGioco(gioco);
user.getTrofeo().add(trofeo);
session.saveOrUpdate(trofeo);
session.getTransaction().commit();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}}
这是我的IndexPage:
package gameplatform.servlet;
public class IndexPage extends HttpServlet {
private static final long serialVersionUID = 1L;
private String pageName;
private String[] template;
/**
* @see HttpServlet#HttpServlet()
*/
public IndexPage() {
super();
// TODO Auto-generated constructor stub
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
this.pageName = getInitParameter("pageIndex");
Configuration conf = new Configuration().configure();
Session session = conf.buildSessionFactory().getCurrentSession();
session.beginTransaction();
String query = "from Template template join template.permessoTemplate joinPage where joinPage.pk.permesso = ? order by joinPage.priority";
List execute = session.createQuery(query).setString(0, pageName).list();
session.getTransaction().commit();
Iterator it = execute.iterator();
int i = 0;
this.template = new String[execute.size()];
while (it.hasNext()) {
Object[] obj = (Object[]) it.next();
Template temp = (Template) obj[0]; ;
this.template[i] = temp.getIndirizzo();
i++;
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
process(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
process(request, response);
}
private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("template", this.template);
RequestDispatcher view = request.getRequestDispatcher("JSP/index.jsp");
view.forward(request, response);
}}
这是我的SQL日志:
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."giocare" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."gioco" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."gruppo" but the required
system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."permessogruppo" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."trofeo" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."utente" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 10:53:45 70000ed64000 InnoDB: Error: Fetch of persistent statistics requested for table "gameplatform"."utentetrofeo" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
2017-05-20 11:54:17 70000ecdc000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2017-05-20 11:54:46 70000ec54000 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
问题在于您的方言引擎更改为您的mysql方言添加以下行,特别是如果您使用spring boot,位于src / main / resources文件夹下的application.properties中。
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
我在SprintBoot 2.x中遇到了这个例外,通过改变已经解决的方言。 org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错
确切地说,在向mysql数据库执行脚本(DDL)时,Hibernate JDBC驱动程序存在问题。
在错误中,有正确的解释:SQL查询有异常,错误“无法添加外键约束”。
您有多个映射表,所以我建议逐个查看哪个表生成错误。这将指导您了解您的Constrain Error。
您提供的错误日志不相关,因为它显示的统计表错误将替换为db引擎执行的其他统计信息。
谢谢
我面临同样的问题,以及从这个例外中解脱出来的原因,已经在下面的步骤中说明了 -
- 在qibernate.cfg.xml文件中将
<hibernate-configuration name="">
标记更改为<hibernate-configuration>
。 - 始终提及连接标记以及localhost,端口和模式名称或数据库名称,如-
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/protein_tracker</property>
这些使得执行无异常,它适用于我,希望它也会帮助你一点!
以上是关于org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错的主要内容,如果未能解决你的问题,请参考以下文章
org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL 时出错“创建表 TABLE_JSON
org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错
org.hibernate.tool.schema.spi.CommandAcceptanceException:在使用 h2 和 JPA 的 SpringBoot 中通过 JDBC 语句执行 DDL