【问题标题】:Springboot JPA on Java 1.6 always gives me GenericJDBCExceptionJava 1.6 中的 Spring Boot JPA 总是给我 GenericJDBCException
【发布时间】:2022-01-10 07:55:44
【问题描述】:

我需要创建一个可以打到数据库的胖罐子,并将获得的文件保存到服务器的目录中。服务器只能运行 Java 6 (1.6)。因此,我用这个 pom 创建了一个 spring 项目:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.app.newapp</groupId>
    <artifactId>fileprocessing</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>editformpemrek</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.6</java.version>
        <tomcat.version>7.0.59</tomcat.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>javax.transaction</groupId>
                    <artifactId>javax.transaction-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.4</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-juli</artifactId>
            <version>${tomcat.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>maven</id>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
    </repositories>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

那我把主类做成这样试试:

@SpringBootApplication
public class FormAssignmentApplication implements CommandLineRunner {

    private static final Logger logger = Logger.getLogger("FormAssignmentApplication");

    @Autowired
    FormService service;

    public static void main(String[] args) {
        new SpringApplicationBuilder(FormAssignmentApplication.class)
                .run(args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println(service.findAll());
    }
}

这是我的服务:

@Service
public class FormService {
    @Autowired
    FormRepository formRepo;
    
    public List<FormAssignment> findAll() {
        return formRepo.findAll();
    }
}

这是我的存储库:

public interface FormRepository extends JpaRepository<FormAssignment, Long> {
    List<FormAssignment> findAll();
}

模型/实体/POJO 有这个形状:

package com.bca.oasys.editformpemrek.model;

import javax.persistence.*;
import java.sql.Timestamp;

@Entity
@Table(name = "ASSIGNMENT_FORM")
public class FormAssignment {
    
    @Id
    @Column(name = "id")
    private Long id;
    
    @Column(name = "student_id")
    private String studentId;
    
    @Column(name = "submitted_file")
    private byte[] doc;

    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }

    public byte[] getDoc() {
        return doc;
    }

    public void setDoc(byte[] doc) {
        this.doc = doc;
    }

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

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }
}

在这种情况下,studentId 不是表中的 ID。

我在 Java 8 上正确运行了这类代码(除了 pom),然后我更改了依赖项以适应 Java 6,我得到了这个异常链:

Caused by: org.springframework.orm.jpa.JpaSystemException: could not execute query; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:310)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:221)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at $Proxy46.findAll(Unknown Source)
    at com.app.newapp.fileprocessing.service.FormService.findAll(FormService.java:22)
    at com.app.newapp.fileprocessing.FormAssignmentApplication.run(FormAssignmentApplication.java:53)
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:672)
    ... 4 more
Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.loader.Loader.doList(Loader.java:2557)
    at org.hibernate.loader.Loader.doList(Loader.java:2540)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
    at org.hibernate.loader.Loader.list(Loader.java:2365)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
    at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:67)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:416)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:401)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    ... 14 more
Caused by: java.sql.SQLException: Fail to convert to internal representation
    at oracle.jdbc.driver.CharCommonAccessor.getBoolean(CharCommonAccessor.java:185)
    at oracle.jdbc.driver.T4CVarcharAccessor.getBoolean(T4CVarcharAccessor.java:794)
    at oracle.jdbc.driver.OracleResultSetImpl.getBoolean(OracleResultSetImpl.java:640)
    at oracle.jdbc.driver.OracleResultSet.getBoolean(OracleResultSet.java:390)
    at org.hibernate.type.descriptor.sql.BitTypeDescriptor$2.doExtract(BitTypeDescriptor.java:75)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:267)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:263)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:338)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2969)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1696)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1628)
    at org.hibernate.loader.Loader.getRow(Loader.java:1515)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:726)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:921)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
    at org.hibernate.loader.Loader.doList(Loader.java:2554)
    ... 39 more

我该怎么办?因为我在 Spring 中很新,而且我的 IDE 中没有任何错误。在检查错误的堆栈跟踪时,我也卡住了,找不到根本原因。我只是看到它无法执行findAll 查询,但我想知道我做错了什么。我还已经将数据库规范(连接字符串、用户名和密码)放在application.properties 中。问题是当我在 java 8 中尝试时,这段代码可以正常运行。非常感谢任何帮助。谢谢。

【问题讨论】:

  • Spring Boot 1.2 不支持 Java 16 或 Java 8 以上的任何版本。您的存储库中的 findAll 也不需要,这已经是标准合同的一部分。
  • JDK 1.6 和 8 都过时了(尤其是 1.6),我建议你使用 JDK 17。同时使用最近的 springboot 版本。
  • @M.Deinum 适用于 Java 6,低于 Java 8。
  • @jewelsea 我知道,但是该服务器上的 java 版本无法升级,因为那里运行着许多旧版应用程序并且与较新的 Java 版本不兼容
  • 你不能安装另一个 jdk 来独立于现有 jdk 和应用程序运行你的应用程序,或者使用 jpackage 将现代 jdk 包含在你的应用程序安装中而不影响现有的东西吗?我从未听说过只能运行 Java 1.6 的服务器。

标签: java spring spring-boot hibernate spring-data-jpa


【解决方案1】:

JpaRepository&lt;FormAssignment, String&gt; - 这里你提到你的主键是字符串类型,但是在你的实体类中你已经用@id 注释了id 变量,它的类型是Long。我认为您必须将其更新为

JpaRepository<FormAssignment, Long>

【讨论】:

  • 谢谢指正,虽然我已经改成Long了,还是不行。
【解决方案2】:

检查数据库中的列数据类型和实体数据类型。它们必须相同。

【讨论】:

  • 它们已经相同了。我已经在 J​​ava 1.8 中尝试过所有这些,没关系
  • 比检查版本
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2017-09-17
  • 2021-07-30
  • 2014-08-21
相关资源
最近更新 更多