У меня есть следующий код, который я хочу перенести на Spring Boot 3:
@Column(name = "OPTION_TYPE")
@Type(type = "org.hibernate.type.ClassType")
private Class<T> clazz;
Пример демо:
Я получаю ошибку:
Cannot resolve method 'type'
Знаете ли вы, как я могу перенести этот код?
Обновлено:
Я пытался использовать:
@Column(name = "OPTION_TYPE")
@JdbcTypeCode(SqlTypes.JAVA_OBJECT)
private Class<T> clazz;
Я получаю эту ошибку:
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Unable to determine SQL type name for column 'option_type' of table 'account_options' because there is no type mapping for org.hibernate.type.SqlTypes code: 2000 (JAVA_OBJECT)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[spring-orm-6.1.5.jar!/:6.1.5]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.5.jar!/:6.1.5]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.5.jar!/:6.1.5]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1833) ~[spring-beans-6.1.5.jar!/:6.1.5]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-6.1.5.jar!/:6.1.5]
... 92 common frames omitted
Caused by: org.hibernate.MappingException: Unable to determine SQL type name for column 'option_type' of table 'account_options' because there is no type mapping for org.hibernate.type.SqlTypes code: 2000 (JAVA_OBJECT)
Spring Boot 3 обновлен до Hibernate 6.
в Hibernate 6 аннотацию @Type можно заменить на @JdbcTypeCode, чтобы код работал.
@Column(name = "OPTION_TYPE")
@JdbcTypeCode(SqlTypes.JAVA_OBJECT)
private Class<T> clazz;
Basic Test class
@TestInstance(value=Lifecycle.PER_CLASS)
public class EnumeratedAccountOptionTest {
private EnumeratedAccountOption<ExampleEnum> option;
@BeforeAll
public void setUp() {
option = new EnumeratedAccountOption<>("Test Option", ExampleEnum.VALUE_ONE);
}
@Test
public void testGetOptionValue() {
assertEquals(ExampleEnum.VALUE_ONE, option.getOptionValue());
}
@Test
public void testGetClazz() {
assertEquals(ExampleEnum.class, option.getClazz());
}
@Test
public void testSetClazz() {
option.setClazz(ExampleEnum.class);
assertEquals(ExampleEnum.class, option.getClazz());
}
private enum ExampleEnum {
VALUE_ONE,
VALUE_TWO
}
}
извините, с помощью @Convert вам придется определить своего собственного новообращенного, но я думаю, вы можете вместо этого попробовать @JdbcTypeCode(SqlTypes.JAVA_OBJECT). Дайте мне знать, если это сработает, я также обновлю ответ docs.jboss.org/hibernate/orm/6.2/javadocs/org/hibernate/type/…
Я заменил код, но не могу его проверить. Я создал этот тестовый код: github.com/rcbandit111/jpa_class_store_migration_poc/blob/main/… Есть идеи по поводу действительного теста?
добавлен пример базового тестового класса
Работает ли он правильно?
вы можете зафиксировать здесь github.com/rcbandit111/jpa_class_store_migration_poc и попробовать
К сожалению, я получаю ошибку при запуске. Пожалуйста, посмотрите стек ошибок сообщений.
Можете ли вы обновить свою демо-версию, чтобы я мог разобраться в вашей проблеме?
Я спросил об этой проблеме на форуме группы пользователей Hibernate. Оказывается, это баг и мне посоветовали открыть баг: hibernate.atlassian.net/browse/HHH-17974
Я получаю ошибку:
Attribute value must be a class literal