«SchemaManagementException: SQL строк добавлено более одного раза» в Hibernate - PullRequest
0 голосов
/ 21 апреля 2020

Я использую 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 этот вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...