Проблема с сохранением простого объекта в режиме гибернации

#java #hibernate

#java #переход в режим гибернации

Вопрос:

У меня есть следующий класс модели:

 package com.swaranga.model;

public final class Book
{
    private Long id;
    private String title;
    private String isbn;

    public Book(){}

    public Book(String title, String isbn)
    {
        this.title = title;
        this.isbn = isbn;
    }

    public final Long getId(){
        return id;
    }

    private final void setId(Long id)
    {
        this.id = id;
    }


    public final String getTitle()
    {
        return title;
    }


    public final void setTitle(String title)
    {
        this.title = title;
    }


    public final String getIsbn()
    {
        return isbn;
    }


    public final void setIsbn(String isbn)
    {
        this.isbn = isbn;
    }
    //assume valid equals and hashcode
}
  

У них есть следующий файл сопоставления Book.hbm.xml:

 <hibernate-mapping>

        <class name="com.swaranga.model.Book" table="book">
            <id name="id" type="long">
                <generator class="native"/>
            </id>

            <property name="title" column="title" type="string"/>

            <property name="isbn" column="isbn" type="string"/>
        </class>

</hibernate-mapping>
  

Следующая схема базы данных:

     CREATE TABLE  `hibernatetest`.`book` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `title` varchar(45) NOT NULL,
      `isbn` varchar(45) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  

Следующий конфигурационный файл режима гибернации:

 <hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver </property>          
        <property name="connection.url">jdbc:mysql://localhost:3306/HibernateTest </property>

        <property name="connection.username"> root </property>

        <property name="connection.password"> latitude </property>

        <property name="show_sql">true</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect </property>

        <property name="myeclipse.connection.profile">mysql</property>

        <mapping resource="comswarangamodelBook.hbm.xml" />
    </session-factory>
</hibernate-configuration>
  

И, наконец, следующий код для сохранения Book объекта:

 public class Main
{
    public static void main(String[] args)
    {
        File f = new File("hibernate.cfg.xml");     
        Configuration cfg = new Configuration();
        SessionFactory sessionFactory = cfg.configure(f).buildSessionFactory();     
        Session s = sessionFactory.openSession();       
        s.beginTransaction();       
        s.save(new Book("JDBC", "ISBN_!@#"));       
        s.flush();      
        s.disconnect();
    }
}
  

Я получаю следующий вывод в консоли:

 Hibernate: insert into book (title, isbn) values (?, ?)
  

Но когда я проверяю свою базу данных, записей нет.

Прошу прощения за такой длинный вопрос, но я счел необходимым сообщить все подробности. Пожалуйста, помогите. Заранее спасибо.

Ответ №1:

Попробуйте изменить конец вашего основного метода на этот:

 Transaction tx = s.beginTransaction();       
s.save(new Book("JDBC", "ISBN_!@#"));       
tx.commit();
s.flush();      
s.disconnect();
  

Комментарии:

1. Понял. Я должен был сказать, s.getTransaction().commit(); после s.save(); Теперь это работает как шарм! Спасибо!

Ответ №2:

Является ли «auto» допустимым классом генератора?

Он не указан в части документации, посвященной отображению O / R, и, судя по тому, что вы делаете, вы не генерируете идентификатор в коде или в базе данных:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html

Я бы посмотрел на native, если вы хотите назначить идентификаторы, или создал генератор идентификаторов, позволяющий MySQL обрабатывать это.

Комментарии:

1. Вы повторно пробовали программу? «не удалось интерпретировать стратегию генератора идентификаторов: auto» предполагает, что он все еще думает, что вы используете auto.

2. Кроме того, чтобы использовать identity, вам необходимо указать столбец id для автоматического увеличения в базе данных.

Ответ №3:

Вы пробовали вводить идентификатор типа «long»?

Ответ №4:

Вы не установили идентификатор базы данных для автоматического увеличения. Попробуйте это. Должно сработать.

Комментарии:

1. Я это сделал. Теперь возникает другая проблема. Смотрите отредактированный вопрос.