2014-12-05 161 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不創建這個表?