Java 休眠异常:无法准备语句

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20443471/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 01:58:16  来源:igfitidea点击:

Hibernate exception: can't prepare statement

javasqlhibernatehibernate-mappingderby

提问by markbratanov

I am trying to insert a record into my database which is being handled by Hibernate (Apache Derby). I have a Userobject class which is was mapped using hbm.xml and the database is connecting fine, however returns the following error:

我正在尝试向我的数据库中插入一条记录,该记录由 Hibernate (Apache Derby) 处理。我有一个使用 hbm.xml 映射的User对象类,并且数据库连接正常,但是返回以下错误:

ERROR: Syntax error: Encountered "USER" at line 1, column 13. Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not prepare statement

I am getting the following in my log:

我在我的日志中收到以下信息:

Dec 07, 2013 4:56:12 PM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
Dec 07, 2013 4:56:12 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.8.Final}
Dec 07, 2013 4:56:12 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Dec 07, 2013 4:56:12 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Dec 07, 2013 4:56:13 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
Dec 07, 2013 4:56:13 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
Dec 07, 2013 4:56:13 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
Dec 07, 2013 4:56:13 PM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: titanmusicplayer/dal/mapping/User.hbm.xml
Dec 07, 2013 4:56:13 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
Dec 07, 2013 4:56:13 PM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: titanmusicplayer/dal/mapping/Song.hbm.xml
Dec 07, 2013 4:56:13 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
Dec 07, 2013 4:56:13 PM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: titanmusicplayer/dal/mapping/Playlist.hbm.xml
Dec 07, 2013 4:56:13 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
Dec 07, 2013 4:56:13 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Dec 07, 2013 4:56:14 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Dec 07, 2013 4:56:14 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20
Dec 07, 2013 4:56:14 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000006: Autocommit mode: false
Dec 07, 2013 4:56:14 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000401: using driver [org.apache.derby.jdbc.EmbeddedDriver] at URL [jdbc:derby:/test;create=true]
Dec 07, 2013 4:56:14 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000046: Connection properties: {user=root, password=****}
Dec 07, 2013 4:56:16 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.DerbyDialect
Dec 07, 2013 4:56:16 PM org.hibernate.dialect.DerbyDialect <init>
WARN: HHH000430: The DerbyDialect dialect has been deprecated; use one of the version-specific dialects instead
Dec 07, 2013 4:56:16 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Dec 07, 2013 4:56:16 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Dec 07, 2013 4:56:17 PM org.hibernate.tuple.PojoInstantiator <init>
INFO: HHH000182: No default (no-argument) constructor for class: titanmusicplayer.bll.Playlist (class must be instantiated by Interceptor)
Dec 07, 2013 4:56:17 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 20000, SQLState: 42X01
Dec 07, 2013 4:56:17 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Syntax error: Encountered "USER" at line 1, column 13.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not prepare statement
    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.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:193)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:89)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.buildBatchStatement(AbstractBatchImpl.java:146)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:135)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3057)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3521)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:393)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:385)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:301)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:349)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1159)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at titanmusicplayer.dal.dao.UserModel.createUser(UserModel.java:49)
    at titanmusicplayer.TitanMusicPlayer.main(TitanMusicPlayer.java:73)
Caused by: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "USER" at line 1, column 13.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown Source)
    at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.doPrepare(StatementPreparerImpl.java:96)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183)
    ... 17 more
Caused by: java.sql.SQLException: Syntax error: Encountered "USER" at line 1, column 13.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    ... 32 more
Caused by: ERROR 42X01: Syntax error: Encountered "USER" at line 1, column 13.
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(Unknown Source)
    at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
    at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
    ... 26 more

My user object class:

我的用户对象类:

public class User {

    private long id;
    private String username;
    private String email;
    private String name;
    private long lastlogin;

    void user(long id, String username, String email, String name, long lastlogin) {
        this.id = id;
        this.username = username;
        this.email = email;
        this.name = name;
        this.lastlogin = lastlogin;
    }

    /* GETTERS */

    public long getId() {
        return this.id;
    }

    public String getUsername() {
        return this.username;
    }

    public String getEmail() {
        return this.email;
    }

    public String getName() {
        return this.name;
    }

    public long getLastlogin() {
        return this.lastlogin;
    }

    /* SETTERS */ 

    public void setId(long id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setLastlogin(long lastlogin) {
        this.lastlogin = lastlogin;
    }

}

My mapped model for Hibernate (xml):

我的 Hibernate (xml) 映射模型:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 7, 2013 4:55:39 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="titanmusicplayer.bll.User" table="USER">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="USERNAME" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" />
        </property>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="lastlogin" type="long">
            <column name="LASTLOGIN" />
        </property>
    </class>
</hibernate-mapping>

My User model:

我的用户模型:

public class UserModel  {

    public UserModel() {
    }

    public Session startSession() {
        Session s = SessionUtil.getSessionFactory().openSession();
        s.beginTransaction();
        return s;
    }

    private static void queryUser(Session session) {
        Query query = session.createQuery("from USER");                 
        List <User>list = query.list();
        java.util.Iterator<User> iter = list.iterator();
        while (iter.hasNext()) {
            User user = iter.next();
            System.out.println("Person: \"" + user.getName() +"\", " + user.getUsername() +"\", " + user.getEmail());
        }

        session.getTransaction().commit();
    }

    public static void createUser(Session session) {
        User user = new User();
        user.setName("Marcus");
        user.setLastlogin(0);
        user.setEmail("[email protected]");
        user.setUsername(null);
        user.setId(0);
        session.save(user);
        session.getTransaction().commit();
    }

    public static List<User> checkLogin(Session s, String email, String password) {
        Query query = s.createQuery("from USER");
        List<User> list = query.list();
        return list;
    }

}

And I call it in Main like this:

我在 Main 中这样称呼它:

public static void main(String[] args) {


        UserModel um = new UserModel();
        Session s = um.startSession();
        UserModel.createUser(s);

    }

Any help on why I'm getting this exception would be appreciated. Been at this all morning and can't seem to resolve it.

任何有关为什么我会收到此异常的帮助将不胜感激。整个上午都在这,似乎无法解决它。

Thanks for suggestions / comments

感谢您的建议/意见

EDIT:

编辑:

Now receiving this

现在收到这个

Hibernate: insert into USERS (USERNAME, EMAIL, NAME, LASTLOGIN, ID) values (?, ?, ?, ?, ?)
Dec 07, 2013 5:25:58 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 20000, SQLState: 42Y07
Dec 07, 2013 5:25:58 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Schema 'ROOT' does not exist

采纳答案by Bryan Pendleton

User is a reserved word in Derby: http://db.apache.org/derby/docs/10.10/ref/rrefkeywords29722.html.

User 是 Derby 中的保留字:http: //db.apache.org/derby/docs/10.10/ref/rrefkeywords29722.html

If you want your table to be named "user", you will have to enclose the table name in double quotes whenever you reference it.

如果您希望将表命名为“user”,则必须在引用时将表名括在双引号中。

If you have control over your schema, you might choose a different name for your table. Perhaps "users", or "usertable", or something that is still mnemonic for you, but isn't a reserved word.

如果您可以控制架构,则可以为表选择不同的名称。也许“用户”或“用户表”,或者对您来说仍然是助记符但不是保留字的东西。