2017-08-15 38 views
0

我使用Spring MVC/ Hibernate應用程序工作,並在一段時間後重新開始工作。這一次,我遇到下面的錯誤,org.hibernate.id.enhanced.TableStructure - 無法讀取hi值

javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: could not read a hi value - you need to populate the table: hibernate_sequence 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:787) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:765) 
    at mobi.puut.database.WalletInfoDaoHibernate.create(WalletInfoDaoHibernate.java:65) 
    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:498) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy39.create(Unknown Source) 
    at mobi.puut.services.WalletServiceImpl.createWalletInfo(WalletServiceImpl.java:279) 
    at mobi.puut.services.WalletServiceImpl.lambda$generateAddress$0(WalletServiceImpl.java:104) 
    at mobi.puut.controllers.WalletManager$1.lambda$onSetupCompleted$0(WalletManager.java:105) 
    at java.lang.Iterable.forEach(Iterable.java:75) 
    at java.util.Collections$SynchronizedCollection.forEach(Collections.java:2062) 
    at mobi.puut.controllers.WalletManager$1.onSetupCompleted(WalletManager.java:105) 
    at org.bitcoinj.kits.WalletAppKit.startUp(WalletAppKit.java:325) 
    at com.google.common.util.concurrent.AbstractIdleService$2$1.run(AbstractIdleService.java:54) 
    at com.google.common.util.concurrent.Callables$3.run(Callables.java:95) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: org.hibernate.id.IdentifierGenerationException: could not read a hi value - you need to populate the table: hibernate_sequence 
    at org.hibernate.id.enhanced.TableStructure$1$1.execute(TableStructure.java:142) 
    at org.hibernate.id.enhanced.TableStructure$1$1.execute(TableStructure.java:126) 
    at org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:55) 
    at org.hibernate.jdbc.AbstractReturningWork.accept(AbstractReturningWork.java:34) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:57) 
    at org.hibernate.id.enhanced.TableStructure$1.getNextValue(TableStructure.java:125) 
    at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40) 
    at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:432) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:105) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:780) 
    ... 23 more 
org.hibernate.id.enhanced.TableStructure: 08/15/2017 13:48:27 - could not read a hi value - you need to populate the table: hibernate_sequence 
Exception in thread " STARTING" java.lang.IllegalStateException: or[email protected]5e9059bd is closed 
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.errorIfClosed(AbstractLogicalConnectionImplementor.java:37) 
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:144) 
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:263) 
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.rollback(AbstractLogicalConnectionImplementor.java:116) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:239) 
    at org.hibernate.engine.transaction.internal.TransactionImpl.rollback(TransactionImpl.java:100) 
    at mobi.puut.database.WalletInfoDaoHibernate.create(WalletInfoDaoHibernate.java:71) 
    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:498) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy39.create(Unknown Source) 
    at mobi.puut.services.WalletServiceImpl.createWalletInfo(WalletServiceImpl.java:279) 
    at mobi.puut.services.WalletServiceImpl.lambda$generateAddress$0(WalletServiceImpl.java:104) 
    at mobi.puut.controllers.WalletManager$1.lambda$onSetupCompleted$0(WalletManager.java:105) 
    at java.lang.Iterable.forEach(Iterable.java:75) 
    at java.util.Collections$SynchronizedCollection.forEach(Collections.java:2062) 
    at mobi.puut.controllers.WalletManager$1.onSetupCompleted(WalletManager.java:105) 
    at org.bitcoinj.kits.WalletAppKit.startUp(WalletAppKit.java:325) 
    at com.google.common.util.concurrent.AbstractIdleService$2$1.run(AbstractIdleService.java:54) 
    at com.google.common.util.concurrent.Callables$3.run(Callables.java:95) 
    at java.lang.Thread.run(Thread.java:748) 

我在Database幾張桌子和下面提供的hibernate_sequence表,

enter image description here

我見過有人建議在論壇上填寫hibernate_sequence表如下,我已經做到了這一點,並沒有解決它的問題。

Insert into wallet.hibernate_sequence(next_val) values(0) 

我用Java annotation based配置和數據庫連接提供如下,

@Bean 
    public DataSource dataSource() { 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); 

     // dataSource.setUrl("jdbc:mysql://localhost:3306/wallet?createDatabaseIfNotExist=true"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/wallet"); 
     dataSource.setUsername("testuser"); 
     dataSource.setPassword("testpassword"); 

     return dataSource; 
    } 

    Properties hibernateProperties() { 

     Properties properties = new Properties(); 
//  properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); 
     properties.setProperty("hibernate.id.new_generator_mappings", "false"); 
     return properties; 
    } 

這裏是POM我使用的應用程序,

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.puut.wallet</groupId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <artifactId>BitcoinWalletApp</artifactId> 
    <name>Bitcoin Wallet</name> 

    <build> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
      <resource> 
       <directory>src/main/java</directory> 
      </resource> 
     </resources> 
    </build> 

    <parent> 
     <groupId>org.bitcoinj</groupId> 
     <artifactId>bitcoinj-parent</artifactId> 
     <version>0.14.4</version> 
    </parent> 

    <properties> 
     <spring.version>4.3.10.RELEASE</spring.version> 
     <spring.security.version>4.2.3.RELEASE</spring.security.version> 
    </properties> 


    <dependencies> 

     <!--crypto-currencies dependencies--> 
     <dependency> 
      <groupId>org.bitcoinj</groupId> 
      <artifactId>bitcoinj-core</artifactId> 
      <version>${project.parent.version}</version> 
     </dependency> 

     <!--spring dependencies--> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 


     <!--spring security dependencies--> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-taglibs</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 


     <!--web API dependencies--> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-validator</groupId> 
      <artifactId>commons-validator</artifactId> 
      <version>1.6</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>18.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.7.20</version> 
     </dependency> 
     <dependency> 
      <groupId>net.glxn</groupId> 
      <artifactId>qrgen</artifactId> 
      <version>1.3</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 


     <!--testing and database dependencies incl. hibernate--> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-dbcp</groupId> 
      <artifactId>commons-dbcp</artifactId> 
      <version>1.4</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>6.0.6</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.2.10.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.4.1.Final</version> 
     </dependency> 


     <!-- Jackson dependencies--> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>jsr311-api</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
    </dependencies> 
</project> 

這裏是WalletInfo POJO,

@Entity 
@Table(name = "wallet_info") 
public class WalletInfo { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    @Column(name = "name") 
    private String name; 

    @NotNull 
    @Column(name = "address") 
    private String address; 

    public Long getId() { 
     return id; 
    } 

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

    public String getName() { 
     return name; 
    } 

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

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

這裏有什麼問題以及如何解決它?

+1

請粘貼您的堆棧跟蹤作爲代碼 –

+0

我已經發布了'錯誤stack'作爲代碼 – Arefe

+1

很大,我試圖重現錯誤 –

回答

3

如果您沒有在數據庫中維護任何序列,則使用 @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) 它會自動爲您的表維護唯一的標識。

javax.persistence.GenerationType.IDENTITY

身份選項只允許數據庫爲應用程序生成一個唯一的主鍵。沒有使用序列或表來維護主鍵信息,相反,數據庫只會爲Hibernate選擇一個適當的唯一編號,以便分配給實體的主鍵。使用MySQL,可以選擇表格中可用的第一個編號最小的主鍵,儘管這種行爲可能因數據庫不同而不同。