2017-07-06 4 views
0

Ich stehe jetzt seit einer Weile mit diesem Fehler. Es ist mir gelungen, einen Work-Around zu finden, indem ich die Entity in meiner HibernateUtil-Klasse abbilde. Dies möchte ich jedoch mit hibernate.cfg.xml erreichen.Java/Hibernate-Tabelle existiert nicht Fehler

Fehler, die ich erhalte:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement 
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) 
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162) 
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1441) 
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:491) 
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3201) 
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2411) 
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:467) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:220) 
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68) 
at Main.main(Main.java:14) 

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mydatabase.personentity' doesn't exist 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 
at com.mysql.jdbc.Util.getInstance(Util.java:408) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) 
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:2490) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) 
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) 
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) 
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:205) 
... 18 more 

Hibernate Config:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/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/mydatabase</property> 
<property name="hibernate.connection.username">root</property> 
<property name="hibernate.connection.password">password</property> 
<property name="connection.pool_size">1</property> 
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="show_sql">true</property> 
<property name="hbm2ddl.auto">update</property> 
<!-- List of mapped classes --> 
<mapping class="PersonEntity"/> 

</session-factory> 
</hibernate-configuration> 

Entity:

@Entity 
public class PersonEntity 
{ 
private int id; 
private String name; 

@Id 
@Column(name = "ID") 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
@Column(name = "Name") 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
} 

Hibernate Util:

public class HibernateUtil 
{ 
private static final SessionFactory sessionFactory = buildSessionFactory(); 

private static SessionFactory buildSessionFactory() { 
try { 
    Configuration configuration = new Configuration(); 
    configuration.configure();   

    StandardServiceRegistry standardRegistry = new 
    StandardServiceRegistryBuilder() 
      .configure() 
      .build(); 

    return configuration.buildSessionFactory(standardRegistry); 
} 
catch(Exception e) { 
    throw new ExceptionInInitializerError(e); 
} 
} 

public static Session getSession() 
{ 
return sessionFactory.openSession(); 
} 

public static void close() 
{ 
sessionFactory.close(); 
} 
} 

Hauptklasse, die einige hartcodierte Werte speichern soll:

public class Main { 
public static void main(String[] args) { 
    PersonEntity personEntity = new PersonEntity(); 

    personEntity.setId(1); 
    personEntity.setName("Cris"); 

    Session session = HibernateUtil.getSession(); 

    session.beginTransaction(); 
    session.save(personEntity); 
    session.getTransaction().commit(); 

} 

} 

Ich wäre dankbar, wenn jemand, meiner Meinung nach ist das Problem in hibernate.cfg.xml legt helfen könnte, aber das ist nur meine Vermutung. Vielen Dank im Voraus

+0

Möchten Sie Hibernate die Tabelle erstellen, wenn es nicht existiert? oder existiert die Tabelle? – XtremeBaumer

+0

Es ist hinzuzufügen, dass, wenn ich diese Zeilen zu meinem HibernateUtil setze, es gut funktioniert: Konfigurationskonfiguration = neue Konfiguration(); \t configuration.configure(); \t configuration.addAnnotatedClass (PersonModel.class); – Kris22

+0

Erstellen Sie eine Tabelle, wenn es nicht existiert, ist es diese Zeile, die es verursacht? aktualisieren Kris22

Antwort

0

Versuchen <property name="hbm2ddl.auto">-<property name="hibernate.hbm2ddl.auto"> Wechsel (Dokument sagt so)

Sie sollten Ihren SQL-Dialekt, ändern. Für MySQL 5.x sollten Sie org.hibernate.dialect.MySQL5InnoDBDialect verwenden, wenn Sie InnoDB Tabellen oder org.hibernate.dialect.MySQL5Dialect verwenden, wenn Sie nicht sind.

Siehe Session Configuration document.

+0

Ich musste Dialekt zu org.hibernate.dialect.MySQL5Dialect Vielen Dank und alle anderen für die Hilfe. – Kris22

+0

@ Kris22 sollten Sie die Antwort akzeptieren, wenn es hilft, Ihr Problem zu lösen, das für später kommende Benutzer sehr nützlich ist. :) Bitte beziehen Sie sich darauf: [Annahme von Antworten: Wie funktioniert es?] (Https://meta.stackexchange.com/a/5235) –

+0

Fertig :) Danke. – Kris22

0

Wenn die Tabelle in der Datenbank vorhanden, zum Beispiel person zu nennen, dann sollten Sie die Einheit mit @Table mit Anmerkungen versehen:

@Entity 
@Table(name = "person") 
public class PersonEntity 

Wenn Sie hibernate wollen Sie die Tabelle erstellen, sollten Sie Ändern Sie zunächst hbm2ddl.auto in create, und ändern Sie sie nach der Erstellung der Tabelle wieder in update.

<property name="hbm2ddl.auto">create</property> 

BTW, die Mapping-Klasse in hibernate.cfg.xml sollte vollständige Paketnamen sein.

+0

Ich habe bereits versucht, es zu ändern, aber es sagt immer noch, dass die Tabelle nicht existiert. – Kris22

+0

Fügen Sie '@Tabelle (name =" person ")' auf die Klasse hinzu. –

+0

Hat auch nicht geholfen. Danke für die Hilfe – Kris22

Verwandte Themen