Почему у меня есть исключение для карт? - PullRequest
1 голос
/ 26 сентября 2010

Сейчас я хочу сделать небольшое Java-приложение, чтобы изучить фреймворк Hibernate. Но это дает мне org.hibernate.MappingException: Repeated column in mapping for entity: model.Book column: author (should be mapped with insert="false" update="false"). И если я удаляю сопоставление столбца автора из entity.hbm.xml, то оно показывает мне сообщение sql «SELEC FROM ...», но после этого оно дает мне 2 исключения:

  • org.hibernate.exception.GenericJDBCException: could not execute query
  • java.sql.SQLException: No database selected.

Кто-нибудь может мне помочь?

hibernate.cfg.xml file:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/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://127.0.0.1:3306</property>
    <property name = "hibernate.connection.username">root</property>
    <property name = "hibernate.connection.password"></property>
    <property name = "hibernate.connection.pool_size">10</property>
    <property name = "dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name = "hibernate.hbm2ddl.auto">update</property>
    <property name = "show_sql">true</property>

    <mapping resource = "entities.hbm.xml"/>

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

entity.hbm.xml file:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package = "model">

   <class name = "Genre" table = "virtual bookcase.genres">
      <id name = "id" column = "idGenres" type = "long">
        <generator class = "increment"/>
      </id>   
      <property name = "name" column = "name" type = "string"/>
      <set name = "books" table = "books" cascade = "all-delete-orphan">
        <key column = "idGenres" not-null = "true" />
        <one-to-many class = "Book"/>
      </set>
   </class>

   <class name = "Book" table = "virtual bookcase.books">
        <id name = "id" column = "idBooks" type = "long">
         <generator class = "increment"/>
        </id>
        <property name = "title" column = "title" type = "string"/>
        <property name = "author" column = "author" type = "string"/>
        <property name = "publisher" column = "author" type = "string"/>
        <property name = "pages" column = "pages" type = "short"/>
        <property name = "borrowed" column = "borrowed" type = "byte"/>
        <property name = "borrowedTo" column = "borrowedTo" type = "string"/>
   </class>

</hibernate-mapping>

Java-объекты:

public class Genre
{
    private long id;
    private String name;
    private Set<Book> books;

    public long getId()
    {
        return id;
    }

    public String getName()
    {
        return name;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Set<Book> getBooks()
    {
        return books;
    }

    public void setBooks(Set<Book> books)
    {
        this.books = books;
    }

    @Override
    public String toString()
    {
        return name;
    }
}

Метод getBooks ():

public Set<Book> getBooks()
    {
        Set<Book> books = null;

        connect();

        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();

        Query q = s.createQuery("FROM Book");
        books = new TreeSet<Book>(q.list());

        for (Book b : books)
            System.out.println(b);

        s.close();
        sf.close();

        disconnect();

        return books;
    }

Ответы [ 2 ]

3 голосов
/ 26 сентября 2010

У вас есть два свойства, сопоставленных с автором столбца:

<property name="author" column="author" type="string"/>
<property name="publisher" column="author" type="string"/>

Чтобы устранить вторую ошибку, добавьте имя базы данных к URL-адресу вашего соединения JDBC:

<property name="hibernate.connection.url">
    jdbc:mysql://127.0.0.1:3306/dbname
</property>

Читая ваши источники, я наткнулся на ваш метод getBooks (). Вы не должны создавать SessionFactory каждый раз, когда вам нужен Hibernate Session. Создание SessionFactory слишком дорого (измерено во времени), чтобы выполнять это каждый раз. Минимальным решением будет класс Singleton, который вы можете запросить для SessionFactory:

public class SessionFactoryUtil {

    private static SessionFactory sessionFactory;

    private SessionFactoryUtil() {}

    static {
       sessionFactory = new Configuration().configure().buildSessionFactory();
    }

    public static SessionFactory getInstance() { return sessionFactory; }

}
0 голосов
/ 26 сентября 2010

Возможно, вам следует определить имя базы данных / схемы внутри сервера. В настоящее время вы указываете только сервер базы данных.

<property name = "hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/DATABASENAME</property>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...