Issue
I am trying to create a table and I am getting an error, I don’t know why. I thought it was because of the float, but my Field table has a float and is being generated correctly.
I was trying to change dialect or create-drop property. But it does not help me. So i really don’t know what to do.
Also, I thought column rank is cause of error, but i don't know why
Error:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table index (id integer not null, lemma_id integer not null, page_id integer not null, rank float not null, primary key (id)) engine=MyISAM" via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:439)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:423)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:314)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:156)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:318)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468)
at loader.Loader.main(Loader.java:22)
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index (id integer not null, lemma_id integer not null, page_id integer not null,' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:762)
at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:646)
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
... 11 more
Hibernate cfg
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/search_engine?useSSL=false</property>
<property name="connection.username">root</property>
<property name="connection.password">roottoor</property>
<property name="connection.pool_size">10</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="hbm2ddl.auto">create-drop</property>
<mapping class="loader.scanner.Website"></mapping>
<mapping class="loader.entity.Field"></mapping>
<mapping class="loader.entity.Lemma"></mapping>
<mapping class="loader.entity.Index"></mapping>
</session-factory>
</hibernate-configuration>
Index entity
package loader.entity;
import javax.persistence.*;
@Entity
@Table(
name = "index"
)
public class Index {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(
name = "page_id",
nullable = false
)
private int pageId;
@Column(
name = "lemma_id",
nullable = false
)
private int lemmaId;
@Column(
nullable = false
)
private float rank;
public Index(int pageId, int lemmaId, float rank) {
this.pageId = pageId;
this.lemmaId = lemmaId;
this.rank = rank;
}
public Index(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPageId() {
return pageId;
}
public void setPageId(int pageId) {
this.pageId = pageId;
}
public int getLemmaId() {
return lemmaId;
}
public void setLemmaId(int lemmaId) {
this.lemmaId = lemmaId;
}
public float getRank() {
return rank;
}
public void setRank(float rank) {
this.rank = rank;
}
@Override
public String toString() {
return "Index{" +
"id=" + id +
", pageId=" + pageId +
", lemmaId=" + lemmaId +
", rank=" + rank +
'}';
}
}
Solution
Index and rank are reserved keywords in SQL. Try changing it to something else.
But if you want to use index only then use below.
@Table(name = "\"index\"")
Answered By - Alien