J'ai vraiment besoin d'aide. J'ai cherché dans toutes les questions que j'ai trouvées sur stackoverflow et rien ne fonctionne. Je n'ai jamais utilisé l'hibernation auparavant et je ne sais pas ce que je fais mal. J'ai généré des tableaux mais avec des insertions, j'ai des problèmes.
Je reçois cette erreur:
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
voici mon fichier de configuration:
<?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>
voici ma page de test:
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", "[email protected]", 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);
}}
voici ma page d'index:
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);
}}
Voici mes journaux 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.
problème dans votre changement de moteur de dialecte à votre dialecte mysql ajouter les lignes suivantes
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
J'ai eu cette exception avec SprintBoot 2.x, en changeant le dialecte, il a été résolu. Org.hibernate.tool.schema.spi.CommandAcceptanceException: Erreur lors de l'exécution du DDL via l'instruction JDBC
Je faisais face au même problème et ce qui me fait ressortir de cette exception a été illustré dans les étapes suivantes:
<hibernate-configuration name="">
en <hibernate-configuration>
dans le fichier hibernate.cfg.xml.<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/protein_tracker</property>
et cela rend l'exécution sans exception, cela fonctionne pour moi, j'espère que cela vous aidera aussi un peu!
Pour être précis, votre pilote Hibernate JDBC a un problème lors de l'exécution d'un script (DDL) vers la base de données mysql.
Dans l'erreur, il y a une explication appropriée: Il y a une exception sur la requête SQL avec l'erreur "Impossible d'ajouter une contrainte de clé étrangère".
Vous avez plusieurs tables mappées, donc je suggère d'aller une par une et de voir quelle génération de table a l'erreur. Cela vous guidera pour comprendre l’erreur de contrainte que vous avez.
Le journal des erreurs que vous avez fourni n'est pas pertinent car il indique les erreurs des tables statistiques qui sont remplacées par d'autres statistiques pour l'exécution du moteur de base de données.
Merci