Как сопоставить столбец идентификатора из базы данных H2 в Java - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь создать таблицу данных и сопоставить эту таблицу с сущностью, используя базу данных H2 в памяти.Я использую spring-boot (выпуск 2.0.2) и flyway для создания базы данных перед запуском.

По какой-то причине мне не удается сопоставить столбец идентификаторов, когда hibernate должен проверять схему.

Предложения?

Таблица:

CREATE TABLE T_ADDRESS (
  ID             BIGINT(19) PRIMARY KEY,
  CREATION_TIME  TIMESTAMP   NOT NULL,
  CREATED_BY     VARCHAR(50) NOT NULL,
  UPDATED_TIME   TIMESTAMP   NOT NULL,
  UPDATED_BY     VARCHAR(50) NOT NULL,
  ADDRESS_LINE_1 VARCHAR(50) NOT NULL,
  ADDRESS_LINE_2 VARCHAR(50),
  ADDRESS_LINE_3 VARCHAR(50),
  CITY           VARCHAR(50) NOT NULL,
  COUNTRY        VARCHAR(7),
  ZIP_CODE       INTEGER(4)  NOT NULL
);

Сущность:

@Entity
@Table(name = "T_ADDRESS")
public class AddressEntity extends PersistentEntity {

    @Id private Long id;

    @Column(name = "ADDRESS_LINE_1", nullable = false) private String addressLine1;
    @Column(name = "ADDRESS_LINE_2") private String addressLine2;
    @Column(name = "ADDRESS_LINE_3") private String addressLine3;
    @Column(name = "CITY", nullable = false) private String city;
    @Column(name = "COUNTRY") private String country;
    @Column(name = "ZIP_CODE", nullable = false) private Integer zipCode;

...
}

Сопоставленный суперкласс:

@MappedSuperclass
public abstract class PersistentEntity {

    @Column(name = "CREATION_TIME") private LocalDateTime creationTime;
    @Column(name = "CREATED_BY") private String createdBy;
    @Column(name = "UPDATED_TIME") private LocalDateTime updatedTime;
    @Column(name = "UPDATED_BY") private String updatedBy;

...
}

Зависимости Maven:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

application.properties:

spring.datasource.url=jdbc:h2:mem:jactor
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=validate

Я пробовал каждый GenerationType (стратегия в @GeneratedValue)

Когда запускается приложение весенней загрузки,контекст приложения завершается ошибкой, когда hibernate будет проверять схему:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125) ~[spring-test-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at ...
Caused by: org.hibernate.AnnotationException: Unknown Id.generator: address_seq
    at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:665) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at ...
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:888) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE]

Я иду вперед, не решая эту проблему.Я создал аспектно-ориентированное решение проблемы, которое будет вводить порядковый номер для идентификатора, если ничего не предоставлено.

Я знаю, что это неубедительное решение, но я могу двигаться вперед и сосредоточиться на более тяжелых потребностях.Это остается проблемой, которая должна быть решена.Я обновил репозиторий на git-hub следующим решением: https://github.com/jactor-rises/jactor

1 Ответ

0 голосов
/ 21 мая 2018

Пожалуйста, пройдите this и выполните поиск GenerationType.SEQUENCE.

Отчисления на основе чтения:

@Id @GeneratedValue(generator = "address_seq", strategy = GenerationType. SEQUENCE) 
@SequenceGenerator(name="<name of schema in H2>", sequenceName = "address_seq", allocationSize=1)
private Long id;
...