首页 文章

Hibernate 's ' hbm2ddl.auto ' property with value ' create'没有重新创建表

提问于
浏览
4

我正在研究first simple Hibernate application . 问题的症结在于,我已经重命名了持久化类的成员(对所有其他部分进行了适当的更改)并重新运行应用程序 . 由于'hbm2ddl.auto'属性在配置xml中被赋予'create'值,因此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'属性,我将Event类中的'title'成员更改为'title1' . 并且,更新了setter和getter方法以及所有引用(在映射xml,Event和EventManager类中) . 没有错误 . 但是,当我尝试运行应用程序时,我看到以下异常:

线程“main”中的异常org.hibernate.exception.SQLGrammarException:org.hibernate中org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)的'字段列表'中的未知列'event0_.title1'位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert的org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)中的.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) (sqlExceptionHelper.java:110)org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java) :81)在Org.hibernate的org.hibernate.loader.getResultSet(Loader.java:8200)的org.hibernate.loader.getResultSet(Loader.java:1953)的$ Proxy6.executeQuery(未知来源)在o的.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)位于org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254)的org.hibernate.loader.Loader.doList(Loader.java:2424)的rg.hibernate.loader.Loader.doList(Loader.java:2438) org.hibernate.loader.Laader.list(Loader.java:2249)位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.list的org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) (QueryTranslatorImpl.java:355)org.hibernate的org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248) . org.hibernate.tutorial.hbm.EventManager.main(EventManager.java:20)中的org.hibernate.tutorial.hbm.EventManager.listEvents(EventManager.java:56)中的internal.QueryImpl.list(QueryImpl.java:101)引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown S)中sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)的'field list'中的未知列'event0_.title1'来自com.mysql的com.mysql.jdbc.Util.handleNewInstance(Util.java:409)的java.lang.reflect.Constructor.newInstance(未知来源)中的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源) . jdbc.Util.getInstance(Util.java:384)位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)的com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562)com.mysql com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)中的com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)中的.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494) . mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)位于com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)的com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)at sun位于sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)的sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)的.reflect.NativeMethodAccessorImpl.invoke0(本地方法)java.lang.reflect.Me thod.invoke(未知来源)org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)... 16更多

该错误指向以下行的EventManager类:

List result = session.createQuery("from Event").list();

由于'hbm2ddl.auto'属性在配置xml中被赋予'create'值,所以Hibernate应该在每次运行时创建新表,但是,它没有这样做 . 请帮助解决问题 .

提前致谢 .

2 回答

  • 13

    尝试指定 hibernate.hbm2ddl.auto=create 而不是 hbm2ddl.auto=create .

    这就是documentation使用 .

  • 1

    试试 <property name="hibernate.hbm2ddl.auto">create</property> 而不是 <property name="hbm2ddl.auto">create</property>

相关问题