2014-12-05 67 views
0

我刚开始在Hibernate中创建项目,开始时出现问题。创建表时发生Hibernate异常

虽然我试图创建一个简单的表,我得到这些错误:

Dec 05, 2014 1:50:09 PM org.hibernate.ejb.HibernatePersistence logDeprecation 
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead. 
Dec 05, 2014 1:50:09 PM org.hibernate.ejb.HibernatePersistence logDeprecation 
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead. 
Dec 05, 2014 1:50:09 PM org.hibernate.ejb.HibernatePersistence logDeprecation 
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead. 
Dec 05, 2014 1:50:09 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation 
INFO: HHH000204: Processing PersistenceUnitInfo [ 
    name: NewPersistenceUnit 
    ...] 
Dec 05, 2014 1:50:09 PM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {4.3.7.Final} 
Dec 05, 2014 1:50:09 PM org.hibernate.cfg.Environment <clinit> 
INFO: HHH000206: hibernate.properties not found 
Dec 05, 2014 1:50:09 PM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
Dec 05, 2014 1:50:10 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> 
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final} 
Dec 05, 2014 1:50:10 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!) 
Dec 05, 2014 1:50:10 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/gmlDatabase] 
Dec 05, 2014 1:50:10 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH000046: Connection properties: {user=lukasz, password=****} 
Dec 05, 2014 1:50:10 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH000006: Autocommit mode: false 
Dec 05, 2014 1:50:10 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 
Dec 05, 2014 1:50:10 PM org.hibernate.dialect.Dialect <init> 
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect 
Dec 05, 2014 1:50:10 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> 
INFO: HHH000397: Using ASTQueryTranslatorFactory 
Hibernate: 
    insert 
    into 
     User 
     (name) 
    values 
     (?) 
Dec 05, 2014 1:50:11 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 1146, SQLState: 42S02 
Dec 05, 2014 1:50:11 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: Table 'gmlDatabase.User' doesn't exist 
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1187) 
    at Main.main(Main.java:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:490) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:195) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:179) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:214) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) 
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) 
    ... 6 more 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'gmlDatabase.User' doesn't exist 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.Util.getInstance(Util.java:360) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) 
    ... 27 more 

,我无法找到解决办法。奇怪的是,我收到有关org.hibernate.ejb.HibernatePersistence弃用的警告,但我无法使用它。我使用org.hibernate.jpa.HibernatePersistenceProvider,如下所示。

任何奇怪的事情是关于没有名为“用户”表的错误。当然不在那里,我想创造它!

另外我使用Intellij Idea 14如果它很重要。 泰雷是我的类和配置文件:

persistence.xml: 
<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> 

    <persistence-unit name="NewPersistenceUnit"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/gmlDatabase"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.username" value="lukasz"/> 
      <property name="hibernate.connection.password" value="p4ssw0rd"/> 
      <property name="hibernate.archive.autodetection" value="class"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hbm2ddl.auto" value="create-drop"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

User.java:

@Entity 
public class User { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 

    public String getName() { 
     return name; 
    } 

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


    public Long getId() { 
     return id; 
    } 

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

和Main.java:

public class Main { 

    public static void main(String[] args) { 
     EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit"); 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 

     User user = new User(); 

     user.setName("Janek"); 

     entityManager.getTransaction().begin(); 
     entityManager.persist(user); 
     entityManager.getTransaction().commit(); 


     entityManager.close(); 
     entityManagerFactory.close(); 
    } 


} 
+0

尽量避免保留特定于数据库的关键字,如'USER'表名。 – 2014-12-05 18:21:03

回答

1

我不相信使用create-drop将更新中-place架构重新添加您删除的表。试试:

<property name="hbm2ddl.auto" value="update"/> 

这是创建一个模式,如果一个不存在,并尝试修改现有的模式以匹配您定义的映射。

也看到这一点, Hibernate hbm2ddl.auto possible values and what they do?

+0

我尝试一切(更新,创建,创建 - 删除),没有任何工作。 – xorgx3 2014-12-05 13:46:31

+0

尝试添加@table注释前。 @table(name =“USER”) – 2014-12-05 13:53:42

+0

如果我添加它,我会得到:错误:表'gmlDatabase.USER'不存在 – xorgx3 2014-12-05 14:01:04

0

添加@Table(schema="gmlDatabase")到实体

UPDATE

我想Hibernate的创建在用户表的主键的AUTO_INCREMENT?如果是这样,您必须将GenerationType设置为IDENTITY

@GeneratedValue(strategy=GenerationType.IDENTITY) 
+0

我添加了这样的内容:'@Entity @Table(schema =“gmlDatabase”)。 @entity后面的@table。很好?如果是,现在我得到错误:“无法解析模式”。但我分配的数据来源,不知道为什么不工作。 – xorgx3 2014-12-05 13:46:53

1

首先检查用户的权限(在这种情况下,你的是“lukasz”),确保你已经创建了数据库权限。如果用户没有权限,则可以使用此命令;

GRANT ALL PRIVILEGES ON * . * TO 'lukasz'@'localhost'; 
+0

是的,我拥有所有权限。 – xorgx3 2014-12-05 13:45:54

+0

授予我的用户的所有权限,解决了这个问题。谢谢! – 2016-10-25 22:17:41

0

一对夫妇的东西突出给我。

看起来这个异常来自尝试插入到用户表中。从堆栈跟踪看起来像是在您调用persist时抛出它。你也说你正在尝试创建用户表。除非我这些年来一直误用EM.persist(),否则它不会创建表,它只会在表中插入/更新该记录。你需要真正进入你的SQL并创建用户表。像

CREATE TABLE gmlDatabase.User (
id NUMBER, 
name VARCHAR(255) 
); 

特定语法的东西可能取决于什么数据库软件使用的是

如果表是不会有相同的名称作为休眠类的名称有所不同,你需要添加一个名字字段添加到@Table注释中。

@Table(name="user_table", schema="gmlDatabase") 
public class Table { 
... 

但我不认为在这种情况下你确实需要这样做。它看起来像你想要的类和表都具有名称“用户”。

最后,尝试上市持久单元标签下的特定类在你的persistence.xml喜欢的东西

<persistence-unit name="NewPersistenceUnit"> 
    ... 
    <class>com.pkg.otherpkg.User</class> 
</persistence-unit> 
0

好吧,我部分解决问题。部分原因是我必须手动创建表格并更正列。 这是日志,但它不是很希望。 http://pastebin.com/uLhz5nUK

我回滚了我的代码中的所有更改,现在看起来像在第一篇文章中。

现在的问题是为什么hibernate不创建这个表?

相关问题