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