Spring Boot Data JPA и PostgreSQL автоматически генерируют тип перечисления - PullRequest
0 голосов
/ 20 февраля 2019

Если я использую MySQL, мои сущности и перечисления создаются успешно.

Я изменил свою базу данных на PostgreSQL-9.4.Итак, у меня есть следующие ошибки:

... Причина: org.hibernate.tool.schema.spi.SchemaManagementException: Невозможно выполнить управление схемой для цели JDBC [создать таблицуроль (id int8 не ноль, имя enum ('ADMIN', 'USER', 'SEARCH') не ноль, первичный ключ (id))] в org.hibernate.tool.schema.internal.TargetDatabaseImpl.accept (TargetDatabaseImpl.java:59) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlString (SchemaMigratorImpl.java:431) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlStrings (SchemaMigratorImpl.java:420) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.tool.schema.internal.SchemaMigratorImpl.createTable (SchemaMigratorImpl.java:236) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] вorg.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigrationToTargets (SchemaMigratorImpl.java:167) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration (SchemaMigratorImpl.java:60) ~ [hibernate-core-5.0.12.Final.jar:5.0.12.Final] в org.hibernate.tool.hbm2ddl.SchemaUpdate.execute (SchemaUpdate.java:134) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.tool.hbm2ddl.SchemaUpdate.execute (SchemaUpdate.java:101) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.internal.SessionFactoryImpl. (SessionFactoryImpl.java:472)~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] в org.hibernate.boot.internal.SessionFactoryBuilderImpl.build (SessionFactoryBuilderImpl.java:444) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build (EntityManagerFactoryBuilderImpl.java:879) ~ [hibernate-entitymanager-5.0.12.Final.jar: 5.0.12.Final]... пропущено 22 общих кадра

Причина: org.postgresql.util.PSQLException: ОШИБКА: тип "enum" не существует Поз.ition: 43 в org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2455) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] в org.postgresql3.ecore.ecore.processResults (QueryExecutorImpl.java:2155) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] at org.postgresql.core.v3.QueryExecutorImpl.execute (QueryExecutorImpl.java:28q ~ - post-java-288 ~)9.4.1212.jre7.jar: 9.4.1212.jre7] в org.postgresql.jdbc.PgStatement.executeInternal (PgStatement.java:430) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] вorg.postgresql.jdbc.PgStatement.execute (PgStatement.java:356) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] в org.postgresql.jdbc.PgStatement.executeWithFlags (PgState.) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] at org.postgresql.jdbc.PgStatement.executeCachedSql (PgStatement.java:289) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] at org.postgresql.jdbc.PgStatement.executeWithFlags (PgStatement.java:266) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7]в org.postgresql.jdbc.PgStatement.executeUpdate (PgStatement.java:246) ~ [postgresql-9.4.1212.jre7.jar: 9.4.1212.jre7] в sun.reflect.NativeMethodAccessorImpl.invoke0 [родной метод]: 1.8.0_191] at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [na: 1.8.0_191] at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessor: 19: 19: 19):] в java.lang.reflect.Method.invoke (Method.java:498) ~ [na: 1.8.0_191] в org.apache.tomcat.jdbc.pool.StatementFacade $ StatementProxy.invoke (StatementFacade.java:114) ~[tomcat-jdbc-8.5.14.jar: na] вcom.sun.proxy. $ Proxy93.executeUpdate (неизвестный источник) ~ [na: na] at org.hibernate.tool.schema.internal.TargetDatabaseImpl.accept (TargetDatabaseImpl.java:56) ~ [hibernate-core-5.0.12.Final.jar: 5.0.12.Final] ... пропущено 32 общих кадра

My Enum:

public enum RoleType {

    ADMIN("ADMIN"),

    SEARCH("SEARCH"),

    USER("USER");

    private final String value;

    RoleType(final String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}

My Role Class:

@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonIgnore
    private Long id;

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "enum('ADMIN', 'USER', 'SEARCH')")
    private RoleType name;

    @ManyToMany(mappedBy = "roles")
    @JsonIgnore
    private Set<User> users;

    public Role() {
    }

    public Role(RoleType name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public RoleType getName() {
        return name;
    }

    public void setName(RoleType name) {
        this.name = name;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return name.toString();
    }
}

Мой файл application.yml для postgresql:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb?autoReconnect=true&useSSL=false
    username: username
    password: password
    driverClassName: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect

Мой старый файл application.yml для mysql:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?autoReconnect=true&useSSL=false
    username: user
    password: password
    driverClassName: com.mysql.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update

Мой pom.xml

<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.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

        <!--dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency-->

    </dependencies>

Как я могу настроить его для автоматической генерации типов перечислений?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

«enum (...)» используется для mysql.Я удалил строку, и проблема была устранена.

@ Column (columnDefinition = "enum ('ADMIN', 'USER', 'SEARCH')")

Однако проект open-source hibernate-types позволяет сопоставлять столбцы, относящиеся к базе данных.Из здесь и здесь мы увидим, как вы можете отобразить тип Enum PostgreSQL на массив Java при использовании JPA и Hibernate.Но я не уверен, как использовать это с пружинной загрузкой.

0 голосов
/ 20 февраля 2019

Я предполагаю, что вы хотите перейти с MySQL на PostgreSQL.

Чтобы использовать перечисления БД PostgreSQL отличается от MySQL.

Подробнее о том, как создать перечисление в PostgreSQL, можно узнать здесь: https://www.postgresql.org/docs/9.1/datatype-enum.html

Это означает, что вы не можете создать перечисление с помощью JPA / Hibernate.

...