我们在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>
的子类的示例。其他子类使用String
或BigInteger
进行参数化。
生成的DDL不包含value
的任何(连接)表或列。
通常可以为包含泛型的数据模型生成数据库方案吗? 如果没有,那么Java和数据库的干净设计是什么?
编辑:重新考虑问题后,预期的数据库方案应如下所示:
| decimal_value | string_value | big_integer_value |
我尝试了以下解决方法:
在超类中使用泛型类型Object
而不是专用于子类:生成的DDL不包含任何值列的提示。
完全忽略超类中的value
并将其添加到每个子类中:如果value
属性具有不同的列名称规范,则为Works:@Column(name="decimal_value")
,否则仅在值上存在随机类型。
到目前为止,这个选项是最好的,但仍然是一种解决方法。
答案 0 :(得分:0)
由于类型擦除,泛型的类型参数在运行时不可用。由于EBean在运行时通过反射工作,因此无法使用泛型类型参数。这就是原始解决方案不起作用的原因。
我不明白你的解决方法1,AFAK,你不能改变派生对象中属性的类型。您可以编写具有不同类型的方法,但它们具有不同的签名,因此独立于原始方法。
您的解决方法2使用不同的列名称是最好的解决方案imho。