我们有一个带有 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,比什么都麻烦。
此时您有两个选择。您可以:
将 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/