我正在尝试将记录插入到我的数据库中,该记录由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);
}
对于我获得此异常的原因,我们将不胜感激。整个上午一直在这,似乎无法解决它。
感谢您提出建议/意见
编辑:
现在收到此
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
答案 0 :(得分:5)
用户是Derby中的保留字:http://db.apache.org/derby/docs/10.10/ref/rrefkeywords29722.html。
如果您希望将表命名为“user”,则只要引用它就必须用双引号将表名括起来。
如果您可以控制架构,则可以为表选择其他名称。也许是“用户”,或“有用”,或者对你来说仍然是助记符的东西,但不是保留字。