有没有办法在 JPA 中使用查找 table 作为转换器?

Is there a way of using a lookup table as a converter in JPA?

假设我有一个简单的实体如下:

@Entity
@Table(name = "PERSON")
public class Person {

@Id
@Column(name = "NAME")
private String name;

@Column(name = "GENDER")
private String gender;
}

和两个 table,实际 table 持有信息和查找 table。

TABLE PERSON (
NAME VARCHAR2 NOT NULL,
GENDER INT NOT NULL);

TABLE GENDER_LOOKUP (
GENDER_ID INT NOT NULL,
GENDER_NAME VARCHAR2 NOTNULL);

我想把我实体的信息保存到table中,这样String字段gender会自动转换成对应的gender int,使用查找table作为参考。想了两种办法,不知道有没有更高效的方法

  1. 创建枚举并使用序号枚举进行持久化。我宁愿避免这种情况,因为我希望只有一个 "source of truth" 用于信息,并且出于各种商业原因,它必须是一个查找 table.

  2. 使用@Converter 注释并编写自定义转换器。我认为这需要我查询 table 以提取相关行,因此这意味着每次转换某些内容时我都必须对数据库进行 JPA 调用。

我目前正计划使用 2,但我想知道是否有任何方法可以在数据库本身内执行此操作,因为我假设使用 JPA 执行所有这些操作的成本高于我这样做的成本数据库中的所有内容。本质上是尝试保留字符串性别,然后数据库会查看查找 table 并将其转换为正确的 ID 并保存。

我专门使用 openJpa,但希望这不是特定于实现的。

既然你认真考虑过使用enum,那就意味着GENDER_LOOKUP是静态的,即程序是运行时内容不会改变。

因此,您应该使用选项 2,但在第一次查找时让转换器 cache/load 来自 GENDER_LOOKUP 的所有记录。这样一来,您仍然只有一个 "source of truth",而无需在每次查找时访问数据库。

如果您需要添加新的性别1,您只需重新启动应用程序以刷新缓存。

1) 这些天,谁知道需要什么新的性别。