【问题标题】:play2 Java EBean ORM: Inheritance and Genericsplay2 Java EBean ORM:继承和泛型
【发布时间】:2014-04-29 15:43:43
【问题描述】:

我们在 Play Framework 2 中有以下使用 Java 和 EBean ORM 的模型类:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Data<T> extends Model {

    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

@Entity
public class DecimalData extends Data<BigDecimal> {
}

后者是Data&lt;T&gt; 的子类的示例。其他子类使用StringBigInteger 进行参数化。

生成的 DDL 不包含value 的任何(连接)表或列。

一般情况下是否可以为这个包含泛型的数据模型生成一个数据库方案? 如果不是,那么 Java 和数据库的简洁设计是什么?

编辑:重新思考问题后,预期的 db 方案应如下所示:

| decimal_value | string_value | big_integer_value |

我尝试了以下解决方法:

  1. 在超类中使用泛型类型Object 并专门用于子类:生成的 DDL 不包含任何值列的提示。

  2. 在超类中完全省略 value 并将其添加到每个子类中:有效,如果 value 属性具有不同的列名称规范:@Column(name="decimal_value"),否则仅存在随机类型的值。 到目前为止,此选项是最好的,但仍然是一种解决方法。

【问题讨论】:

    标签: java generics inheritance playframework ebean


    【解决方案1】:

    由于类型擦除,泛型的类型参数在运行时不可用。由于 EBean 在运行时通过反射工作,它不能使用泛型类型参数。这就是为什么您的原始解决方案不起作用的原因。

    我不明白您的解决方法 1,AFAK,您无法更改派生对象中属性的类型。您可以编写不同类型的方法,但它们具有不同的签名,因此独立于原始方法。

    使用不同列名的解决方法 2 是恕我直言的最佳解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      相关资源
      最近更新 更多