Свойство hibernate 'hbm2ddl.auto' со значением 'create' не создает таблицу заново
Я работаю над своим первым простым приложением Hibernate. Суть проблемы в том, что я переименовал член в постоянный класс (с соответствующими изменениями во всех остальных частях) и перезапустил приложение. Поскольку свойству 'hbm2ddl.auto' присваивается значение 'create' в конфигурации xml, ожидается, что Hibernate будет создавать новую таблицу при каждом запуске, но этого не происходит. Ниже приводится подробная информация:
УЧЕБНЫЙ КЛАСС:
public class Event {
private Long id;
private String title;
private Date date;
public Event() {
// this form used by Hibernate
}
public Event(String title, Date date) {
// for application use, to create new events
this.title = title;
this.date = date;
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Event.hbm.xml:
<hibernate-mapping package="org.hibernate.tutorial.hbm">
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="increment"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
hibernate.cfg.xml, среди прочего, имеет следующую запись:
<property name="hbm2ddl.auto">create</property>
ГЛАВНЫЙ КЛАСС:
public class EventManager {
public static void main(String[] args) {
EventManager mgr = new EventManager();
List events = mgr.listEvents();
for (int i = 0; i < events.size(); i++) {
Event theEvent = (Event) events.get(i);
System.out.println( "Event: " + theEvent.getTitle() + " Time: " + theEvent.getDate() );
}
HibernateUtil.getSessionFactory().close();
}
private List listEvents() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List result = session.createQuery("from Event").list();
session.getTransaction().commit();
return result;
} }
Приведенный выше код работает как положено. Просто чтобы проверить свойство hbm2ddl.auto, я изменил элемент title в классе Event на title1. И, обновленные методы установки и получения и все ссылки (в отображении xml, Event и EventManager class). Соблюдается без ошибок. Но, когда я пытаюсь запустить приложение, я вижу следующее исключение:
Исключение в потоке "main" org.hibernate.exception.SQLGrammarException: неизвестный столбец 'event0_.title1' в 'списке полей' в org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) в org.hiber.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) в org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) в org.hibernate.engine.jsb.c. SqlExceptionHelper.java:110) в org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) в org.hibernate.engine.jdbc.internal.proxy.Herb.in 81) на $Proxy6.executeQuery(Неизвестный источник) на org.hibernate.loader.Loader.getResultSet(Loader.java:1953) на org.hibernate.loader.Loader.doQuery(Loader.java:829) на org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) в организации.hibernate.loader.Loader.doList(Loader.java:2438) в org.hibernate.loader.Loader.doList(Loader.java:2424) в org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254) в org.hibernate.loader.Loader.list(Loader.java:2249) в org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) в org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) в org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) в org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248) в org.hiber.QueryImpl.list(QueryImpl.java:101) в org.hibernate.tutorial.hbm.EventManager.listEvents(EventManager.java:56) в org.hibernate.tutorial.hbm.EventManager.main(EventManager.java:20). Причина by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: неизвестный столбец 'event0_.title1' в 'списке полей' в sun.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод) в sun.reflect.NativeConstrul. rce) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(неизвестный источник) по адресу java.lang.reflect.Constructor.newInstance (неизвестный источник) по адресу com.mysql.jdbc.Util.handleNewInstance(Util.java:409) в com.mysql.jdbc.Util.getInstance(Util.java:384) в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java.m35).jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494) в com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960) в com.mysql.jdbc.MysqlIO.sqlQueryDirect(Mysql4).mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696) в com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105) в com.mysql.jdbc.PreparedStatement.executeQ22ment).reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke(неизвестный источник) в java.lang.reflectM od.invoke(Неизвестный источник) в org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) ... еще 16
Ошибка указывает на класс EventManager в следующей строке:
List result = session.createQuery("from Event").list();
Поскольку свойству 'hbm2ddl.auto' присваивается значение 'create' в конфигурации xml, ожидается, что Hibernate будет создавать новую таблицу при каждом запуске, но этого не происходит. Пожалуйста, помогите решить проблему.
Заранее спасибо.
2 ответа
Попробуйте указать hibernate.hbm2ddl.auto=create
вместо просто hbm2ddl.auto=create
,
Это то, что используется в документации.
Пытаться <property name="hibernate.hbm2ddl.auto">create</property>
вместо <property name="hbm2ddl.auto">create</property>