jpa 如何确定“无法确定'PersonBO'的推荐JdbcType”的问题位置?

qpgpyjmq  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

我正在将一个应用程序从Payara & ProsseLink移植到Quarkus(使用Hibernate)。

JdbcTypeRecommendationException
    Failed to start quarkus: io.quarkus.dev.appstate.ApplicationStartException: 
org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException: 
Could not determine recommended JdbcType for `Entity`

字符串
这个问题在PostgreSQL中运行的很好。我已经阅读了Stack Overflow上的所有相关问题。我已经在PostgreSQL数据库中所有有JSONB列的属性中添加了Hibernate特定的注解@JdbcTypeCode(SqlTypes.JSON)。[这个问题][1]表明错误不在实体类本身,而是在任何引用中。真的有很多引用!
我想知道我是否可以让Hibernate告诉我是哪个类和哪个属性抛出了异常?
Hibernate迫使我将注解@DiscriminatorValue(value = "P")添加到PersonBO,这既不需要通过JPA 2.2也不需要。也许问题与此有关?
这是实体(我省略了Java基本类型的所有setter和getter)

@Entity
@Access(AccessType.PROPERTY)
@Table(name = PersonBO.TABLENAME)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.CHAR, name = "prssubclass")
@DiscriminatorValue(value = "P")
public class PersonBO {

    /** Name of this database table is {@value} */
    final public static String TABLENAME = "person";

    // --- Database columns
    private UUID id = UUID.randomUUID();
    private List<AddressGeoBO> adrGeos = null;
    private Map<String, Object> prsAttributes = null;
    private Gender prsGender = null;
    private Set<UUID> tags = null;

    @Convert(converter = UuidConverter4jpa.class)
    @GeneratedValue(strategy = GenerationType.UUID)
    @Id
    public UUID getId() { return id; }

    @Json
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,
            mappedBy = AddressGeoBO.FIELD_PERSONBO,
            targetEntity = AddressGeoBO.class, orphanRemoval = true)
    public List<AddressGeoBO> getAdrGeos() { return adrGeos; }

    @Convert(converter = JsonMapConverter4jpa.class)
    @JdbcTypeCode(SqlTypes.JSON)
    @Json
    public Map<String, Object> getPrsAttributes() { return this.prsAttributes; }

    @Convert(converter = Gender.Converter4jpa.class)
    @Json(converter = Gender.Converter4json.class)
    public Gender getPrsGender() { return this.prsGender; }

    @Convert(converter = JsonSetUuidConverter4jpa.class)
    @JdbcTypeCode(SqlTypes.JSON)
    @Json
    public Set<UUID> getTags() { return tags; }
}


多对一引用的表如下所示:

@Entity
@Access(AccessType.PROPERTY)
@Table(name = AddressGeoBO.TABLENAME)
public class AddressGeoBO {
    final public static String TABLENAME = "addressgeo";
    private UUID id = UUID.randomUUID();
    private PersonBO personBO = null;

    @JoinColumn(name = "personId", referencedColumnName = "id")
    @ManyToOne(targetEntity = PersonBO.class)
    public PersonBO getPersonBO() { return this.personBO; }
}


PersonBO的子类:

@Entity
@Access(AccessType.PROPERTY)
@Table(name = "identity")
@DiscriminatorValue(value = "I")
public class IdentityBO extends PersonBO { ... }


运行mvn build quarkus:dev时的完整堆栈跟踪:

2023-09-24 15:40:20,279 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: io.quarkus.dev.appstate.ApplicationStartException: org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException: Could not determine recommended JdbcType for `com.djarjo.person.PersonBO`
        at io.quarkus.dev.appstate.ApplicationStateNotification.waitForApplicationStart(ApplicationStateNotification.java:58)
        at io.quarkus.runner.bootstrap.StartupActionImpl.runMainClass(StartupActionImpl.java:123)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:113)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:423)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:55)
        at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138)
        at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93)
        at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
        at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
    Caused by: org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException: Could not determine recommended JdbcType for `com.djarjo.person.PersonBO`
        at org.hibernate.type.descriptor.java.spi.UnknownBasicJavaType.getRecommendedJdbcType(UnknownBasicJavaType.java:37)
        at org.hibernate.boot.model.process.internal.InferredBasicValueResolver.from(InferredBasicValueResolver.java:222)
        at org.hibernate.mapping.BasicValue.buildResolution(BasicValue.java:480)
        at org.hibernate.mapping.BasicValue.resolve(BasicValue.java:310)
        at org.hibernate.mapping.BasicValue.resolve(BasicValue.java:300)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.lambda$processValueResolvers$4(InFlightMetadataCollectorImpl.java:1842)
        at java.base/java.util.ArrayList.removeIf(ArrayList.java:1682)
        at java.base/java.util.ArrayList.removeIf(ArrayList.java:1660)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processValueResolvers(InFlightMetadataCollectorImpl.java:1841)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1827)
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:328)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootMetadataBuilder.build(FastBootMetadataBuilder.java:406)
        at io.quarkus.hibernate.orm.runtime.PersistenceUnitsHolder.createMetadata(PersistenceUnitsHolder.java:101)
        at io.quarkus.hibernate.orm.runtime.PersistenceUnitsHolder.constructMetadataAdvance(PersistenceUnitsHolder.java:73)
        at io.quarkus.hibernate.orm.runtime.PersistenceUnitsHolder.initializeJpa(PersistenceUnitsHolder.java:40)
        at io.quarkus.hibernate.orm.runtime.HibernateOrmRecorder$1.created(HibernateOrmRecorder.java:78)
        at io.quarkus.arc.runtime.ArcRecorder.initBeanContainer(ArcRecorder.java:79)
        at io.quarkus.deployment.steps.ArcProcessor$generateResources844392269.deploy_0(Unknown Source)
        at io.quarkus.deployment.steps.ArcProcessor$generateResources844392269.deploy(Unknown Source)
        at io.quarkus.runner.ApplicationImpl.<clinit>(Unknown Source)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:70)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
        at io.quarkus.runner.GeneratedMain.main(Unknown Source)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:104)
        at java.base/java.lang.Thread.run(Thread.java:833)

  [1]: https://stackoverflow.com/questions/73312803/could-not-determine-recommended-jdbctype-for-class

vatpfxk5

vatpfxk51#

一个月后,我解决了一个问题,作为一个例子来解释这个问题。我走了艰难的道路,删除所有实体,并重新插入它们一个接一个,以定位Hibernate问题,这是在另一个实体的例子。这另一个实体都有一个引用实体“人”和它的主键。这导致了上面的错误消息。由于误导性的异常消息,我花了很多时间才找到根本原因。
总而言之,这对像Hibernate这样的库的作者来说是一个教训:
每当抛出一个异常包含导致问题的数据!

相关问题