Hibernate的“hbm2ddl.auto”,值为“创造”属性不重新创建表(Hibernate&

2019-06-24 20:44发布

我的工作我的第一个简单的Hibernate应用程序 。 问题的关键是,我已经改名为持久化类的成员(与易改变所有其他部分),然后重新运行该应用程序。 作为“hbm2ddl.auto”财产分配“创造”的XML配置值,休眠预计在每次运行时创建新表,但是,它没有这样做。 以下是详细信息:

类:

    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”属性,我已经改变了“标题”在事件类“TITLE1”成员。 而且,更新的setter和getter方法和所有引用(在映射XML,事件和eventmanager进行类)。 遵守没有任何错误。 但是,当我尝试运行应用程序时,我看到以下异常:

异常在线程“主要” org.hibernate.exception.SQLGrammarException:在org.hibernate作为在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)“字段列表”未知列“event0_.title1”。 exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert( 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)在$ 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.hibernate.internal .QueryImpl.list(QueryImpl.java:101)在org.hibernate.tutorial.hbm.EventManager.listEvents(EventManager.java:56)在org.hibernate.tutorial.hbm.EventManager.main(EventManager.java:20)引起由:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)在sun.reflect.NativeConstructorAccessorImpl.newInstance(未知叟在“字段列表”未知列“event0_.title1” RCE)在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:3562)在com.mysql .jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)在融为一体。 mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)在com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)在阳光下.reflect.NativeMethodAccessorImpl.invoke0(本地方法)在sun.reflect.NativeMethodAccessorImpl.invoke(来源不明)在sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明)在java.lang.reflect.Meth od.invoke(来源不明)在org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)... 16个

错误指向eventmanager进行类在以下行:

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

作为“hbm2ddl.auto”财产分配“创造”的XML配置值,休眠预计在每次运行时创建新表,但是,它没有这样做。 请帮助解决问题。

提前致谢。

Answer 1:

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

这就是文档使用。



Answer 2:

尝试<property name="hibernate.hbm2ddl.auto">create</property>代替<property name="hbm2ddl.auto">create</property>



文章来源: Hibernate's 'hbm2ddl.auto' property with value 'create' is not re-creating table