Я использую Spring Boot 2.2.6.RELEASE
, hibernate-core-5.4.12.Final
, h2-1.4.200
Короткая история:
У меня есть 2 класса, а именно ModelOne
, который является основным, содержащим @EmbeddedId
и ModelOneId
, которые содержат 2 поля / столбца, которые являются составными первичными ключами, встроенными в ModelOne
. Когда я запускаю приложение весенней загрузки, я получаю
Причина: org.hibernate.tool.schema.spi.SchemaManagementException: SQL строк добавлено более одного раза для: ModelOne
, который фактически является ModelOneId, имя класса root которого - ModelOne.
Длинная история:
ModelOne класс:
@Entity
public class ModelOne implements Serializable {
...
@EmbeddedId
private ModelOneId id;
public ModelOne() {
}
Класс ModelOneId: (здесь определяется составной ключ)
@Embeddable
public class ModelOneId implements Serializable {
...
@Column(name = "SOME_COLUMN_NAME_ONE")
private BigInteger someColumnNameOne;
@Column(name = "SOME_COLUMN_NAME_TWO")
private String someColumnNameTwo;
public ModelOneId() {
}
public ModelOneId(BigInteger someColumnNameOne, String someColumnNameTwo) {
this.someColumnNameOne = someColumnNameOne;
this.someColumnNameTwo= someColumnNameTwo;
}
У меня есть следующие настройки:
properties.put("hibernate.hbm2ddl.auto", "create-drop"); //same issue with create
properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties.put("hibernate.hql.bulk_id_strategy", "org.hibernate.hql.spi.id.inline.InlineIdsInClauseBulkIdStrategy");
Некоторые журналы :
INFO o.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: org.hibernate.jpa.HibernatePersistenceProvider]
INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 5.4.12.Final
INFO org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate:
drop table model_one if exists
Hibernate:
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: org.hibernate.jpa.HibernatePersistenceProvider] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: SQL strings added more than once for: model_one
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
... 21 common frames omitted
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: SQL strings added more than once for: model_one
at org.hibernate.tool.schema.internal.SchemaDropperImpl.checkExportIdentifier(SchemaDropperImpl.java:344)
После отладки:
- ModelOne
отбрасывается
- ModelOneId
имеет класс root как ModelOne
и Hibernate
пытается сбросить ModelOne
снова, но, поскольку он уже был удален, выдается ошибка.
In SchemaDropperImpl.java
:
Это метод, который выбрасывает ошибка:
private static void checkExportIdentifier(Exportable exportable, Set<String> exportIdentifiers) {
final String exportIdentifier = exportable.getExportIdentifier();
if ( exportIdentifiers.contains( exportIdentifier ) ) {
throw new SchemaManagementException( "SQL strings added more than once for: " + exportIdentifier );
}
exportIdentifiers.add( exportIdentifier );
}
Экземпляр idValue
из exportable
показывает правильный componentClassName
, то есть ModelOneId
, но owner
показывает className
(RootClass) как ModelOne
Как я могу разрешить ve этот вопрос?