无法确定推荐的 JdbcType <class>

问题描述 投票:0回答:6

我一直在四处寻找,可能我发现的最接近的东西是这个Stack Overflow线程,但它仍然没有回答我的问题。即使使用最新的 spring(截至撰写时)框架(2.7.2)、

hibernate
(6.1.2.Final)和
hibernate-entitymanager
(5.6.10.Final),我仍然遇到麻烦。我的完整错误堆栈如下:

INFO <PID> --- [main] com.lms.controller.SpringBootController  : Starting SpringBootController using Java 17.0.4 on <OS> with PID <PID> <FILEPATH> started by <USER> in <FILEPATH>)
INFO <PID> --- [main] com.lms.controller.SpringBootController  : No active profile set, falling back to 1 default profile: "default"
INFO <PID> --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
INFO <PID> --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 28 ms. Found 2 JPA repository interfaces.
INFO <PID> --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
INFO <PID> --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
INFO <PID> --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/10.0.22]
INFO <PID> --- [main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
INFO <PID> --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 944 ms
INFO <PID> --- [main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
INFO <PID> --- [main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.1.2.Final
WARN <PID> --- [main] org.hibernate.orm.deprecation            : HHH90000021: Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.sharedCache.mode] instead
INFO <PID> --- [main] SQL dialect                              : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
ERROR <PID> --- [main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Could not determine recommended JdbcType for `com.lms.entity.Role`
WARN <PID> --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Could not determine recommended JdbcType for `com.lms.entity.Role`
INFO <PID> --- [main] com.lms.controller.SpringBootController  : Starting SpringBootController using Java 17.0.4 on <OS> with PID <PID> <FILEPATH> started by <USER> in <FILEPATH>)
INFO <PID> --- [main] com.lms.controller.SpringBootController  : No active profile set, falling back to 1 default profile: "default"
INFO <PID> --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
INFO <PID> --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 28 ms. Found 2 JPA repository interfaces.
INFO <PID> --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
INFO <PID> --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
INFO <PID> --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/10.0.22]
INFO <PID> --- [main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
INFO <PID> --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 944 ms
INFO <PID> --- [main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
INFO <PID> --- [main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.1.2.Final
WARN <PID> --- [main] org.hibernate.orm.deprecation            : HHH90000021: Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.sharedCache.mode] instead
INFO <PID> --- [main] SQL dialect                              : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
ERROR <PID> --- [main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Could not determine recommended JdbcType for `com.lms.entity.Role`
WARN <PID> --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Could not determine recommended JdbcType for `com.lms.entity.Role`
INFO <PID> --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
INFO <PID> --- [main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
  ERROR <PID> --- [main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Could not determine recommended JdbcType for `com.lms.entity.Role`
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1753) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1141) ~[spring-context-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:916) ~[spring-context-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592) ~[spring-context-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.0-M4.jar:3.0.0-M4]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-3.0.0-M4.jar:3.0.0-M4]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:430) ~[spring-boot-3.0.0-M4.jar:3.0.0-M4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.0.0-M4.jar:3.0.0-M4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-3.0.0-M4.jar:3.0.0-M4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-3.0.0-M4.jar:3.0.0-M4]
        at com.lms.controller.SpringBootController.main(SpringBootController.java:30) ~[classes/:na]
Caused by: org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException: Could not determine recommended JdbcType for `com.lms.entity.Role`
        at org.hibernate.type.descriptor.java.spi.UnknownBasicJavaType.getRecommendedJdbcType(UnknownBasicJavaType.java:37) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.type.descriptor.java.spi.BasicCollectionJavaType.getRecommendedJdbcType(BasicCollectionJavaType.java:70) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.boot.model.process.internal.InferredBasicValueResolver.from(InferredBasicValueResolver.java:222) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.mapping.BasicValue.buildResolution(BasicValue.java:507) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.mapping.BasicValue.resolve(BasicValue.java:315) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.mapping.BasicValue.resolve(BasicValue.java:305) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.lambda$processValueResolvers$4(InFlightMetadataCollectorImpl.java:1766) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at java.base/java.util.ArrayList.removeIf(ArrayList.java:1682) ~[na:na]
        at java.base/java.util.ArrayList.removeIf(ArrayList.java:1660) ~[na:na]
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processValueResolvers(InFlightMetadataCollectorImpl.java:1765) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1751) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:300) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1350) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1421) ~[hibernate-core-6.1.2.Final.jar:6.1.2.Final]
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:362) ~[spring-orm-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:338) ~[spring-orm-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1799) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1749) ~[spring-beans-6.0.0-M5.jar:6.0.0-M5]
        ... 16 common frames omitted

这是我的

Role.java
文件:

package com.lms.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.EnumType;

@Entity
@Table(name = "roles")
public class Role {
    @Id
    @Column(name = "roleID", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int roleID;
    
    @Enumerated(EnumType.STRING)
    @Column(name = "roleName", nullable = false)
    private RoleEnum roleName;

    public int getRoleID(){
        return this.roleID;
    }
    public void setRoleID(int roleid){
        this.roleID = roleid;
    }
    public RoleEnum getRoleName(){
        return this.roleName;
    }
    public void setRoleName(RoleEnum rolename){
        this.roleName = rolename;
    }

    @Override
    public String toString(){
        return "The role's id is: " + this.roleID + "\nThe role's name is: " + this.roleName.toString();
    }
}

即使我的

Role.java
仅包含 roleID 值,我也会得到相同的错误,该错误不会抛出在我的其他实体类上,这些类基本上是相同的。这个类的唯一独特之处是基于此 Enum 类的
RoleEnum
类型:
RoleEnum.java

public enum RoleEnum {
    SUPER_ADMIN,
    FORUM_ADMIN,
    ACCOUNTANT,
    LIBRARIAN,
    NORMAL_USER,
    FORUM_USER
}

当我尝试复制 此人的在 Java Spring 中实现 JWT 的指南并且有效时,我遇到了这个错误,但他们使用的是

2.2.11.RELEASE
而不是我正在使用的
3.0.0-M4

我可能的候选人是

jakarta.*
而不是
javax.*
有一些时髦的东西,我不完全理解它们之间的差异。我认为可能有问题的另一个候选人是 EntityManager 的某些内容导致了问题,但我找不到任何相关信息。我的错误是
Could not determine recommended JdbcType for com.lms.entity.Role
,我可以做些什么来解决这个问题吗?

java spring spring-boot spring-data-jpa spring-jdbc
6个回答
7
投票

我遇到了同样的问题,我通过添加

@ManyToOne
注释来解决它。 我想在你的情况下它会在
RoleEnum
字段中。 嗯,至少对我来说是这样的。


3
投票

此错误有很多原因,但在您的情况下,似乎是

Role
实体与在关系中使用它的另一个实体之间的关系。出现此错误的最常见原因是在另一个实体中引用此实体,并且没有设置正确的注释。

在我的例子中,我有实体

MealFood
(错误日志指向的),并且它在
Meal
实体中使用。 (一对多从
MealFood
开始)。问题是我没有在
Meal
实体中正确映射它,所以 hibernate 不知道如何处理它。

请检查 jayson mulwa 答案中提到的

Role
实体是否在另一个类中使用,并添加正确的注释。

希望有帮助。


2
投票

我也有类似的错误。并不是真正的依赖性问题。

org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException: Could not determine recommended JdbcType for com.payment.Payment

就我而言,我发现 Payment 实体与其他实体有关系,并且实际上在其他地方使用。

通过删除其他实体中使用的实体的实例来修复错误,因此不会“混淆”Hibernate 如何创建支付实体。


1
投票

我为此苦苦挣扎了很长一段时间,但在任何地方都找不到解决方案。我发现原因是在另一个实体中,我用 @ManyToOne 调用错误消息中提到的实体(对我来说,它是用户实体,对于 OP 来说,它似乎是角色)。只有在调用它的地方添加

@JdbcTypeCode(SqlTypes.JSON)
后,错误才消失,所以它看起来像这样:

@JdbcTypeCode(SqlTypes.JSON)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SUBMITTED_BY")
private User user;

我ofc也必须导入:

import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

我不知道这个修复是否会导致另一个问题,或者我错过了其他东西,因为我什至找不到我在哪里得到原始解决方案,但祈祷它没问题。


0
投票

虽然很简短,但 Gustavo Junkes 提出的解决方案和 Paimon 的解释帮助我解决了从 javax.persistence 迁移到 jakarta.persistence 期间遇到的类似情况。以下是我如何解决类似问题,以便在两个实体之间建立 @OnetoMany 关系:

我必须在子实体 (ITEM) 上添加 @ManyToOne 关系。我坚持认为以前使用 javax.persitence 是不必要的(尽管原因可能是其他原因,因为其他依赖项已更改)。无论如何,在没有它之前它工作得很好。所以这就是我现在所拥有的有效方法: 在项目实体(子)中:

@Column(name = "BRAND_ID", nullable = false, insertable = false, updatable = false)
private long brandId;

@JoinColumn(name = "BRAND_ID", nullable = false)
@ManyToOne(targetEntity=Brand.class, fetch=FetchType.LAZY)
private Brand brand;

在品牌实体(父级)中:

   @Column(name="BRAND_ID")
   private long id;

   @OneToMany(targetEntity= Item.class, cascade=ALL, mappedBy="brand", fetch=FetchType.LAZY)
   private List<Item> items = new ArrayList<>();

请注意,在迁移到 jakarta.persistence 之前,@OneToMany 注释引用了子实体中的“brandId”属性。现在它指的是子实体中的新“品牌”属性。这是以前的情况。此外,无需在子实体中指定 @ManyToOne 注释:

@OneToMany(targetEntity=Item.class, cascade=ALL, mappedBy="brandId", fetch=FetchType.LAZY)
private List<Item> items = new ArrayList<>();

-1
投票

这是因为您的更改保留在

hibernate.cfg.xml
中 - 请检查您进行了一些更改的
hibernate.cfg.xml
文件 - 因此请更正它 在我的问题中,我错误地更改了类名

© www.soinside.com 2019 - 2024. All rights reserved.