当前位置: 首页 > 知识库问答 >
问题:

Spring Boot数据JPA和PostgreSQL自动生成枚举类型

陆英毅
2023-03-14

如果我使用MySQL,我的实体和枚举将成功创建。

我将数据库更改为PostgreSQL-9.4。因此,我有以下错误:

...原因:org.hibernate.tool.schema.spi.SchemaManagementException:无法对JDBC目标执行架构管理[创建表角色(id int8 not null,name enum('ADMIN','USER','SEARCH')not null,主键(id)]在org.hibernate.tool.schema.internal.TargetDatabase aseImpl.accept(TargetDatabase aseImpl.java:59)~[hibernate-core-5.0.12。Final.jar: 5.0.12。最终]在org.hibernate.tool.schema.internal.SchemaMigrorImpl.applySqlString(SchemaMigrorImpl.java:431)~[hibernate-core-5.0.12。Final.jar: 5.0.12。最终]在org.hibernate.tool.schema.internal.SchemaMigrorImpl.applySqlStrings(SchemaMigrorImpl.java:420)~[hibernate-core-5.0.12。Final.jar: 5.0.12。最终]在org.hibernate.tool.schema.internal.SchemaMigrorImpl.create表(SchemaMigrorImpl.java:236)~[hibernate-core-5.0.12。Final.jar: 5.0.12。最终]在SchemaMigrorSchemaUpdate.execute(SchemaUpdate.java:134)~[hibernate-core-5.0.12。Final.jar: 5.0.12。最终]在org.hibernate.tool.hbm2ddl。SchemaUpdate.execute(SchemaUpdate.java:101)~[hibernate-core-5.0.12。Final.jar: 5.0.12。最终]在org. hibernate. interal。SessionFactoryImpl.(SessionFactoryInp. java: 472)~[hibernate-core-5.0.12。最终. jar: 5.0.12。最终]在org. hibernate. boot. interal。SessionFactoryBuilderInp. build(SessionFactoryBuilderInp. java: 444)~[hibernate-core-5.0.12。最终. jar: 5.0.12。最终]在org. hibernate. jpa. boot. interal。EntityManagerFactoryBuilderInp. build(EntityManagerFactoryBuilderInp. j

原因:组织。postgresql。util。PSQLException:错误:类型“enum”不存在组织位置:43。postgresql。果心v3。查询ExecutorImpl。org上的receiveErrorResponse(QueryExecutorImpl.java:2455)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。果心v3。查询ExecutorImpl。org上的processResults(QueryExecutorImpl.java:2155)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。果心v3。查询ExecutorImpl。在org上执行(QueryExecutorImpl.java:288)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。jdbc。PG声明。org上的executeInternal(PgStatement.java:430)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。jdbc。PG声明。在org上执行(PgStatement.java:356)~(postgresql-9.4.1212.jre7.jar:9.4.1212.jre7)。postgresql。jdbc。PG声明。org上的executeWithFlags(PgStatement.java:303)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。jdbc。PG声明。org上的executeCachedSql(PgStatement.java:289)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。jdbc。PG声明。org上的executeWithFlags(PgStatement.java:266)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。postgresql。jdbc。PG声明。在sun上执行更新(PgStatement.java:246)~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)~[na:1.8.0\u 191]。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:62)~[na:1.8.0\u 191]。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0\u 191]。lang.reflect。方法在org上调用(Method.java:498)~[na:1.8.0\u 191]。阿帕奇。公猫jdbc。水塘StatementFacade$StatementProxy。在com上调用(StatementFacade.java:114)~[tomcat-jdbc-8.5.14.jar:na]。太阳代理$Proxy93。组织上的executeUpdate(未知源)~[na:na]。冬眠工具架构。内部的TargetDatabaseImpl。accept(TargetDatabaseImpl.java:56)~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]。。。省略32个公共框架

我的枚举:

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;
    }
}

我的角色类别:

@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

我的旧应用程序。mysql的yml文件

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个答案

和斌
2023-03-14

“枚举(...)”用于mysql。我删除了该行,问题已修复。

@列(columnDefinition=“枚举('ADMIN','USER','SEARCH”))

但是,开源hibernate类型项目允许您映射特定于数据库的列。我们将从这里和这里了解如何在使用JPA和Hibernate时将PostgreSQL枚举类型映射到Java数组。但我不知道如何将其与Spring靴配合使用。

吴胜
2023-03-14

我假设您想从MySQL迁移到PostgreSQL。

使用DB枚举PostgreSQL不同于MySQL。

阅读有关如何在PostgreSQL中创建枚举的详细信息,请单击此处:https://www.postgresql.org/docs/9.1/datatype-enum.html

这意味着您无法使用JPA/Hibernate创建枚举。

 类似资料:
  • 问题内容: 假设我有一个格式为基本XML的文件,如下所示: 我想在运行时变成这样的东西: …,然后将新创建的枚举传递给我的应用程序。我将如何实现这样的目标?可以吗 问题答案: 您尝试做的事情没有任何意义。枚举实际上仅是为了编译时的利益,因为它们表示一组固定的常量。在运行时,动态生成的枚举的含义是什么- 与普通对象有什么不同?例如: 您的XML可以解析为新实例化的对象,这些对象可以存储在某些程序中,

  • 问题内容: 我正在尝试将Postgres自定义类型(名为transmission_result)映射到Hibernate / JPA POJO。postgres自定义类型或多或少是字符串值的枚举类型。 我创建了一个名为PGEnumUserType的自定义EnumUserType以及一个表示postgres枚举值的枚举类。当我对一个真实的数据库运行它时,我收到以下错误:’ERROR:列“状态”的类型

  • 问题内容: 假设是,我将如何产生给定序数的枚举值? 问题答案: 足够了。一条线; 足够简单。

  • Spring 3.x、JPA 2.0、Hibernate 4.x、Postgresql 9.x. 使用希望映射到Postgresql枚举的枚举属性处理Hibernate映射类。 使用枚举列上的where子句进行查询会引发异常。 SQL: Hibernate xml查询: > 按而不是按枚举查询工作正常。 没有数据库交互的Java工作良好: 不是,与和相同,异常更改为: 在查看https://sta

  • 我有以下结构 包含枚举,该枚举包含或。现在我有了一个类,它包含一个。 这是在swagger yml中指定的(删除了一些不相关的代码) 我使用(也尝试了v3&openapi-generator)生成代码,配置如下: 现在发生的情况是,库将生成注释: 这里的问题是,如果我现在尝试反序列化/序列化包含带有的收件箱的Json字符串,它将引发异常,因为没有名称为的已知子类型。 seralizer期望注释指定

  • 使用JAXB从XSD(作为标准分发,我无法控制,也无法更改)生成一些POJO有很多困难。问题似乎与XSD中定义某些类型的方式有关。下面我粘贴了一个在XSD中定义的名为TransactionCodeType的简单类型,它是一个令牌与值的枚举列表(也定义为令牌)的联合。 使用JAXB,生成的输出(见下文)被翻译为Java中的基本类型字符串。我使用的是来自org的最新版本的maven-jaxb2-plu