Hibernate的值为'create'的'hbm2ddl.auto'属性不是重新创建表 [英] Hibernate's 'hbm2ddl.auto' property with value 'create' is not re-creating table

查看:89
本文介绍了Hibernate的值为'create'的'hbm2ddl.auto'属性不是重新创建表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理第一个简单的Hibernate应用程序。问题的症结在于,我重新命名了持久类的成员(对所有其他部分进行了适当更改),然后重新运行该应用程序。由于'hbm2ddl.auto'属性在配置xml中被分配了'create'值,所以Hibernate需要在每次运行时创建一个新表,但它并没有这样做。以下是详细信息:

CLASS:


  public class Event {
private Long id;

私有字符串标题;
私人日期日期;
$ b $ public Event(){
// Hibernate使用的这种形式
}

public Event(String title,Date date){
//用于应用程序使用,创建新事件
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:
p>

 < hibernate-mapping package =org.hibernate.tutorial.hbm> 

< class name =Eventtable =EVENTS>
< id name =idcolumn =EVENT_ID>
< generator class =increment/>
< / id>
< property name =datetype =timestampcolumn =EVENT_DATE/>
< property name =title/>
< / class>



hibernate.cfg.xml,其中包括以下内容:

 < property name =hbm2ddl.auto>创建< / property> ; 

主要类别:

<$ p (); $ p $ 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();


$ b private list listEvents(){
Session session = HibernateUtil.getSessionFactory()。getCurrentSession();
session.beginTransaction();
List result = session.createQuery(from Event)。list();
session.getTransaction()。commit();
返回结果;
}}

以上代码正常工作。为了测试'hbm2ddl.auto'属性,我将Event类中的'title'成员更改为'title1'。并且,更新了setter和getter方法以及所有引用(在映射xml,Event和EventManager类中)。没有错误。但是,当我尝试运行应用程序时,发现以下异常:


线程main中的异常org.hibernate.exception.SQLGrammarException :未知列在 '字段列表' event0_.title1'
在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
在org.hibernate.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)
at $ Proxy6.executeQuery(Unknown Source)
at org.hib ernate.loader.Loader.getResultSet(Loader.java:1953)
在org.hibernate.loader.Loader.doQuery(Loader.java:829)
在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections( Loader.java:289)
在org.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)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248)
at 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:未知列'event0_.title1 在 '字段列表' 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
在sun.reflect.NativeConstructorAccessorImpl.newInstance(来源不明)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance
(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com。 mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:3562)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)
在com.mysql.jdbc.MysqlI O.sqlQueryDirect(MysqlIO.java:2114)
在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)
在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java: 2105)
在com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
。在sun.reflect.NativeMethodAccessorImpl。 invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.engine。 jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
... 16 more


错误指向下面一行的EventManager类:

  List result = session.createQuery(from Event)。 

由于'hbm2ddl.auto'属性在配置xml中被赋予'create'值,所以Hibernate被期望在每一次运行中都创建一个新表格,但这并不是如此。请帮忙解决问题。



预先感谢。

解决方案

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



这就是文档使用。


I'm working on my first simple Hibernate application. The crux of the problem is, I had renamed a member of persistent class (with apt changes to all other parts) and re-run the application. As 'hbm2ddl.auto' property is assigned 'create' value in configuration xml, Hibernate is expected to create new table on every run but, it's not doing so. Following is detailed information:

CLASS:

    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, among others, has following entry:

<property name="hbm2ddl.auto">create</property>

MAIN CLASS:

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;
} }

The above code is working as expected. Just to test 'hbm2ddl.auto' property, I had changed 'title' member in Event class to 'title1'. And, updated setter and getter methods and all references (in mapping xml, Event and EventManager class). Complied with no errors. But, when I try to run the application, I see following exception:

Exception in thread "main" org.hibernate.exception.SQLGrammarException: Unknown column 'event0_.title1' in 'field list' at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) at $Proxy6.executeQuery(Unknown Source) at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) at org.hibernate.loader.Loader.doQuery(Loader.java:829) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) at org.hibernate.loader.Loader.doList(Loader.java:2438) at org.hibernate.loader.Loader.doList(Loader.java:2424) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254) at org.hibernate.loader.Loader.list(Loader.java:2249) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248) at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) at org.hibernate.tutorial.hbm.EventManager.listEvents(EventManager.java:56) at org.hibernate.tutorial.hbm.EventManager.main(EventManager.java:20) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'event0_.title1' in 'field list' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) ... 16 more

The error is pointing to EventManager class at following line:

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

As 'hbm2ddl.auto' property is assigned 'create' value in configuration xml, Hibernate is expected to create new table on every run but, it's not doing so. Please help resolve the problem.

Thanks in advance.

解决方案

Try specifying hibernate.hbm2ddl.auto=create instead of just hbm2ddl.auto=create.

This is what the documentation uses.

这篇关于Hibernate的值为'create'的'hbm2ddl.auto'属性不是重新创建表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆