Java 枚举、JPA 和 Postgres 枚举 - 如何让它们一起工作?

标签 java postgresql jpa

我们有一个带有 postgres 枚举的 postgres 数据库。我们开始将 JPA 构建到我们的应用程序中。我们还有 Java 枚举,它反射(reflect)了 postgres 枚举。现在最大的问题是如何让 JPA 一方面理解 Java 枚举,另一方面理解 postgres 枚举? Java 方面应该相当简单,但我不知道如何做 postgres 方面。

最佳答案

实际上,我一直在使用一种比 PGObject 和转换器更简单的方法。由于在 Postgres 中,枚举可以很自然地转换为文本,因此您只需要让它做它最擅长的事情。如果 Arjan 不介意的话,我会借用他的情绪例子:

Postgres 中的枚举类型:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

Java中的类和枚举:

public @Entity class Person {

  public static enum Mood {sad, ok, happy};

  @Enumerated(EnumType.STRING)
  Mood mood;

}

@Enumerated 标记表示枚举的序列化/反序列化应以文本形式完成。没有它,就用int,比什么都麻烦。

此时您有两个选择。您可以:

  1. stringtype=unspecified 添加到连接字符串,如 JDBC connection parameters 中所述。这让 Postgres 猜测右侧类型并充分转换所有内容,因为它收到类似“enum =unknown”的内容,这是一个它已经知道如何处理的表达式(将 ? 值提供给左侧类型反序列化器) 。 这是首选选项,因为它应该一次性适用于所有简单的 UDT,例如枚举。

    jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
    

或者:

  • 创建从 varchar 到数据库中枚举的隐式转换。因此,在第二种情况下,数据库收到一些赋值或比较,例如“enum = varchar”,并且它在其内部目录中找到一条规则,表明它可以通过 varchar 的序列化函数传递右侧值,然后通过 varchar 的反序列化函数传递右侧值。枚举。这比实际需要的步骤要多;并且目录中有太多隐式转换可能会导致任意查询产生不明确的解释,因此请谨慎使用。 Actor 阵容是:

    使用 INOUT 隐式创建 Actor 阵容(角色随情绪变化);

  • 应该可以这样工作。

    关于Java 枚举、JPA 和 Postgres 枚举 - 如何让它们一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59884178/

    相关文章:

    ruby-on-rails - 使用 Postgres 在 ActiveRecord 查询中别名计算结果、分组和求和

    php - 使用 PHP 的 Postgres 备份数据

    java - JPA自动增量的差异

    java - JPA找到尚未提交的实体?

    java - Spring 3.0 Java REST返回PDF文档

    java - 使用 IntelliJ 部署 Tomcat - 服务器未连接

    java - 如何在 java 中调用 c# web 服务?

    java - 来自 tomcat 7 的电子邮件编码

    ruby-on-rails - 在 postgres 和 Rails 中的数组、json 和 hstore 数据类型之间进行选择

    jpa - 为什么要使用 Querydsl?