【问题标题】:Hibernate exception: can't prepare statement休眠异常:无法准备语句
【发布时间】:2013-12-24 23:01:50
【问题描述】:

我正在尝试将一条记录插入到由 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

我的日志中出现以下内容:

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$1.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

我的用户对象类:

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

}

我的 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>

我的用户模型:

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("blah@gmail.com");
        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;
    }

}

我在 Main 中这样称呼它:

public static void main(String[] args) {


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

    }

任何关于为什么我得到这个例外的帮助将不胜感激。整个上午都在这个问题上,似乎无法解决它。

感谢您的建议/cmets

编辑:

现在收到了

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

【问题讨论】:

  • 您可以启用 SQL 日志记录 (show_sql=true) 并查看生成的 SQL 中有什么问题
  • @mmdw 谢谢,日志出现在哪里?在控制台中还是已保存?好像没找到啊。。
  • 这取决于记录器的配置。 Enable hibernate logging
  • 谢谢。现在收到这个insert into USERS (USERNAME, EMAIL, NAME, LASTLOGIN, ID) values (?, ?, ?, ?, ?) 似乎没有准备声明?还是我错了?
  • 您需要指出表所在的正确模式。或者您可以在默认架构 ROOT 中自动创建表 (hbm2ddl.auto=create)。

标签: java sql hibernate hibernate-mapping derby


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。将表格重构为用户...现在我看到以下内容(见最后)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2013-12-31
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多