我们有一个带有 postgres 枚举的 postgres 数据库。我们开始将 JPA 构建到我们的应用程序中。我们还有 Java 枚举,它反映了 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,比什么都麻烦。
此时您有两个选择。你要么:
-
Add 字符串类型=未指定到连接字符串,如中所述JDBC 连接参数这让 Postgres 猜测右侧类型并充分转换所有内容,因为它收到类似“enum =unknown”的内容,这是一个它已经知道如何处理的表达式(将 ? 值提供给左侧类型反序列化器) 。这是首选选项,因为它应该一次性适用于所有简单的 UDT,例如枚举。
jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
Or:
-
在数据库中创建从 varchar 到 enum 的隐式转换。因此,在第二种情况下,数据库收到一些赋值或比较,例如“enum = varchar”,并且它在其内部目录中找到一条规则,表明它可以通过 varchar 的序列化函数传递右侧值,然后通过 varchar 的反序列化函数传递右侧值。枚举。这比实际需要的步骤要多;并且目录中有太多隐式转换可能会导致任意查询产生不明确的解释,因此请谨慎使用。演员阵容创作如下:
创建演员阵容(角色随情绪变化),以 INOUT 为隐式;
应该就这样工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)