#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. Я это сделал. Теперь возникает другая проблема. Смотрите отредактированный вопрос.