web-dev-qa-db-ja.com

org.hibernate.exception.SQLGrammarException:ステートメントを実行できませんでした

私はHibernateで簡単なプログラムを試し、たくさんの例外を見つけました。

何が悪いのかわからなかった。

私は3つのクラスを持っています-本、リーダー、そして使用。最後は、最初の2つを1対多の依存関係でバインドすることです。

これが私の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");
    }
}

例外メッセージは次のとおりです。

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)

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>

DBのすべてのテーブルが作成されますが、空です。すべて大丈夫に見えます。助言がありますか?

  • この問題の解決方法
5
nazar_art

MySQLでは[〜#〜] using [〜#〜]予約語 です。

したがって、Usingエンティティで@javax.persistence.Tableアノテーションを使用して、テーブルの名前を変更するだけです。何かのようなもの

@Entity
@Table(name = "TB_USING")
public class Using {
    ...
}

USINGのテーブルがあると想定しましたが、これは1対多の関係であるため、テーブルを省略して、Readerテーブルの単一の外部キーだけを使用してモデル化できます。

ちなみに、hibernateは多対多の結合テーブル(外部キー以外の属性はありません)の新しいエンティティの作成を強制しません。しかし、その関係のエンティティを持つことは良い習慣だと思います。ほとんどの場合、将来、関係に対していくつかの属性が定義されるためです。

9
Amir Pashazadeh

Amirが指摘したように、MySQLだけでなくHibernateにも予約語があります。

見る:

予約語、休止状態/ JPA

0
Damir Olejar