J'ai essayé le programme facile à Hibernate et attrapé un groupe d'exception.
Je ne pouvais pas comprendre ce qui ne va pas.
J'ai trois classes - Livre, Lecteur et Utilisation. Le dernier lie les deux premiers avec une dépendance de un à plusieurs.
Voici ma main()
:
public class Appl {
public static void main(String[] args) {
Book book = new Book();
book.setTitle("book01155");
//
Reader reader = new Reader();
reader.setName("reader2");
//
Using using = new Using();
using.setIdBook(book);
using.setIdReader(reader);
//
List<Book> elements = new ArrayList<Book>();
//
Session session = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.save(book);
session.save(reader);
session.save(using);
elements = session.createCriteria(Book.class).list();
session.getTransaction().commit();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
for (Book b : elements) {
System.out.println("book: id=" + b.getIdBook() + " Title="
+ b.getTitle());
}
System.out.println("\nThe END.\n");
}
}
Voici un message d'exception:
ERROR: 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 'USING (IDBOOK, IDREADER) values (2, 2)' at line 1
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.Java:82)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.Java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.Java:125)
extrait de hiberante.cfg.xml
:
<hibernate-configuration>
<session-factory>
<property name="Eclipse.connection.profile">097Hibernate</property>
<property name="connection.url">jdbc:mysql://localhost/_097_Library</property>
<property name="connection.username">root</property>
<property name="connection.password">secret</property>
<!-- property name="hbm2ddl.auto">create</property -->
<property name="hbm2ddl.auto">update</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<mapping class="com.softserve.edu.Book" />
<mapping class="com.softserve.edu.Reader" />
<mapping class="com.softserve.edu.Using" />
</session-factory>
</hibernate-configuration>
Toutes les tables de la base de données sont créées mais sont vides. Tout semble bien. Aucune suggestion?
Dans MySQL, UTILISERest est réservé Word .
Il suffit donc de renommer la table en utilisant l'annotation @javax.persistence.Table
sur votre entité Using
. Quelque chose comme
@Entity
@Table(name = "TB_USING")
public class Using {
...
}
J'ai supposé que vous aviez une table pour USING
, mais vous avez indiqué qu'il s'agissait d'une relation un à plusieurs. Vous pouvez donc l'omettre et la modéliser à l'aide d'une seule clé étrangère dans la table Reader
.
À propos, hibernate ne vous oblige pas à créer une nouvelle entité pour les tables de jointure plusieurs à plusieurs (qui n'ont plus d'attribut que les clés étrangères). Mais je pense que c'est une bonne pratique d'avoir une entité pour cette relation, car la plupart du temps, certains attributs seront définis pour la relation à l'avenir.
Comme Amir l'a souligné, il existe des mots réservés, non seulement dans MySQL, mais également dans Hibernate.
Voir: