属性 自定义类型的 Hibernate Envers
Hibernate Envers with custom type for property
我目前在我的 Springboot 应用程序中设置 Hibernate Envers 时遇到问题。我的一个模型中有一个枚举类型,在我的 PostgreSQL 数据库中,该列的类型为 "Type".
属性:
@Enumerated(STRING)
@Type(type = "pgsql_enum")
private VehicleTypes vehicleType;
此 属性 的模型 class 注释为:
@Entity(name = "cars")
@Audited
@TypeDef(name = "pgsql_enum", typeClass = PostgreSqlEnumType.class)
自定义类型 "PostgreSqlEnumType" 是:
public class PostgreSqlEnumType extends EnumType {
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, OTHER);
} else {
st.setObject(index, value.toString(), OTHER);
}
}}
不幸的是,当我构建它时出现以下错误:
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:382)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 39 more
Caused by: org.hibernate.MappingException: Unable to instantiate custom type: <myPackage>.PostgreSqlEnumType
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:217)
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:203)
at org.hibernate.type.TypeFactory.byClass(TypeFactory.java:117)
at org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:112)
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:416)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:398)
at org.hibernate.mapping.Property.isValid(Property.java:225)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:595)
at org.hibernate.mapping.RootClass.validate(RootClass.java:265)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 46 more
Caused by: java.lang.NullPointerException
at org.hibernate.type.EnumType.getAnnotation(EnumType.java:134)
at org.hibernate.type.EnumType.getEnumType(EnumType.java:125)
at org.hibernate.type.EnumType.setParameterValues(EnumType.java:80)
at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:152)
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:213)
... 57 more
我似乎无法让休眠模式识别此自定义类型。在实施 Envers 之前,这一直编译得很好。
版本:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version>
</dependency>
PostgreSQL 类型定义:
CREATE TYPE customer_cars.vehicle_types AS ENUM
('CAR', 'PUP');
抱歉所有的转储,任何帮助将不胜感激!
谢谢!
此问题已通过 HHH-12304 解决。
您需要更新到包含该修复程序的版本,以避免您遇到不幸的问题。由于这未反向移植到 5.1,您需要考虑包含该修复程序的最新 5.2.x 版本之一。
我目前在我的 Springboot 应用程序中设置 Hibernate Envers 时遇到问题。我的一个模型中有一个枚举类型,在我的 PostgreSQL 数据库中,该列的类型为 "Type".
属性:
@Enumerated(STRING)
@Type(type = "pgsql_enum")
private VehicleTypes vehicleType;
此 属性 的模型 class 注释为:
@Entity(name = "cars")
@Audited
@TypeDef(name = "pgsql_enum", typeClass = PostgreSqlEnumType.class)
自定义类型 "PostgreSqlEnumType" 是:
public class PostgreSqlEnumType extends EnumType {
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, OTHER);
} else {
st.setObject(index, value.toString(), OTHER);
}
}}
不幸的是,当我构建它时出现以下错误:
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:382)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 39 more
Caused by: org.hibernate.MappingException: Unable to instantiate custom type: <myPackage>.PostgreSqlEnumType
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:217)
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:203)
at org.hibernate.type.TypeFactory.byClass(TypeFactory.java:117)
at org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:112)
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:416)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:398)
at org.hibernate.mapping.Property.isValid(Property.java:225)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:595)
at org.hibernate.mapping.RootClass.validate(RootClass.java:265)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 46 more
Caused by: java.lang.NullPointerException
at org.hibernate.type.EnumType.getAnnotation(EnumType.java:134)
at org.hibernate.type.EnumType.getEnumType(EnumType.java:125)
at org.hibernate.type.EnumType.setParameterValues(EnumType.java:80)
at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:152)
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:213)
... 57 more
我似乎无法让休眠模式识别此自定义类型。在实施 Envers 之前,这一直编译得很好。
版本:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version>
</dependency>
PostgreSQL 类型定义:
CREATE TYPE customer_cars.vehicle_types AS ENUM
('CAR', 'PUP');
抱歉所有的转储,任何帮助将不胜感激!
谢谢!
此问题已通过 HHH-12304 解决。
您需要更新到包含该修复程序的版本,以避免您遇到不幸的问题。由于这未反向移植到 5.1,您需要考虑包含该修复程序的最新 5.2.x 版本之一。