play2 Java EBean ORM:继承和泛型

时间:2014-04-29 15:43:43

标签: java generics inheritance playframework ebean

我们在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<T>的子类的示例。其他子类使用StringBigInteger进行参数化。

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

通常可以为包含泛型的数据模型生成数据库方案吗? 如果没有,那么Java和数据库的干净设计是什么?

编辑:重新考虑问题后,预期的数据库方案应如下所示:

| decimal_value | string_value | big_integer_value |

我尝试了以下解决方法:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

您的解决方法2使用不同的列名称是最好的解决方案imho。