java - 计算属性 wrt JPA。这对我有用吗?

标签 java jpa enums

我有一个场景,我有 2 个标签需要配置。标签的名称是“Out Date”和“In Date”。我在数据库中只有一个名为“日期”的字段。它是“Out”还是“In”在运行时由枚举“Scenario”的值决定。但是,我需要实际向用户显示 Out Date&In Date,以便他可以选择 1 个或两个。我听说 JPA 将协助计算字段概念。这是真的还是有其他方法可以实现这一目标。下面是一些示例代码。

日期

@Override
@Convert("DateTimeConverter")
@Column(name = "DATE")
public DateTime getDate() {
    return date;
}

场景

@Override
@Convert("EnumConverter")
@Column(name = "SCENARIO")
public Scenario getScenario() {
    return scenario;
}

场景是任何具有值 OUT(1),IN(2) 的枚举

最佳答案

JPA 中没有计算属性。

您可以使用@Transient 注解来创建不持久化但根据其他字段计算的属性:

@Transient
public DateTime getInDate() {
    if (scenario == Scenario.IN) {
        return date;
    }
    return null;
}

@Transient
public DateTime getOutDate() {
    if (scenario == Scenario.OUT) {
        return date;
    }
    return null;
}

或者,如果您使用的是 Hibernate,则可以使用专有注释 @Formula:

@Formula("case when SCENARIO = 2 then DATE else NULL end")
@Convert("DateTimeConverter")
private DateTime inDate;

@Formula("case when SCENARIO = 1 then DATE else NULL end")
@Convert("DateTimeConverter")
private DateTime outDate;

我更喜欢第一个选项,因为:

  • 使用单元测试更容易测试
  • 在单元测试中更容易使用实体
  • 它不需要专有扩展
  • 通常 SQL 的可移植性可能存在一些问题,尽管在这个问题中 case when 是 SQL 92 兼容的,因此它在这里不适用

我能解决的唯一问题是,最简单的方法是我们通过向客户端公开实体的内部结构(scenariodate 属性)来放弃封装。但是您始终可以使用访问器 protected 隐藏这些属性,JPA 仍会处理它。

关于java - 计算属性 wrt JPA。这对我有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397781/

相关文章:

iphone - Objective-C 使用 typedef enum 来设置类行为,就像 Cocoa 一样

java - Spring Boot 属性迁移器

java - Javers Spring Boot 集成按实例 ID 查询生成器返回空结果

java - 运行和调试程序 Java、Eclipse 的不同行为

java - 在 ActionBarActivity 中创建 AlertDialog

jpa - JPQL 中的复杂顺序

java - 为什么 H2 在自动创建模式之前尝试在数据库中加载数据?

mysql - 无法建立 JDBC 连接 - 没有有效的解决方案 :/

c# - 通过反射获取枚举值

python - 分类特征编码作为 Scikit-Learn 的枚举