Java DataNucleus能否持久化使用泛型参数化的抽象基类?
使用DataNucleus,我很高兴使用抽象基类为子类提供“long”ID(请注意原语类型) 在修改一个新的类时,我想到了将基类参数化。其目的是支持不同的ID类型,例如字符串Java DataNucleus能否持久化使用泛型参数化的抽象基类?,java,generics,jdo,datanucleus,type-erasure,Java,Generics,Jdo,Datanucleus,Type Erasure,使用DataNucleus,我很高兴使用抽象基类为子类提供“long”ID(请注意原语类型) 在修改一个新的类时,我想到了将基类参数化。其目的是支持不同的ID类型,例如字符串 @PersistenceCapable @Inheritance(strategy=InheritanceStrategy.SUBCLASS_TABLE) @Version(strategy=VersionStrategy.VERSION_NUMBER, column="jdo_version") public abstr
@PersistenceCapable
@Inheritance(strategy=InheritanceStrategy.SUBCLASS_TABLE)
@Version(strategy=VersionStrategy.VERSION_NUMBER, column="jdo_version")
public abstract class VersionedIdEntity<P>
implements Serializable {
static final long serialVersionUID = 1L;
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
private P id;
public P getId() {
return id;
}
}
@PersistenceCapable
@继承(策略=继承祖先策略。子类_表)
@版本(strategy=VersionStrategy.Version\u编号,column=“jdo\u Version”)
公共抽象类VersionedIdEntity
实现可序列化{
静态最终长SerialVersionId=1L;
@主键
@持久性(valueStrategy=IdGeneratorStrategy.INCREMENT)
私人身份证;
公共P getId(){
返回id;
}
}
泛型让我使用包装的Java类型“Long”,因此子类声明如下:
public class Account extends VersionedIdEntity<Long>
公共类帐户扩展了VersionedIdEntity
我切换到新基类时出错,指出找不到“java.lang.Object”的实现
org.datanucleus.exceptions.nucleuserexception:字段“VersionedIdEntity.id”声明为引用类型(接口/对象),但未找到“java.lang.Object”的实现类
错误是否与类型擦除有关
另外的问题是(1)JPA如何处理它,以及(2)我是否可以将类型p限制为,例如:
<? extends PersistableType>
您的意思是JDO是否定义了一个实现应该支持这一点?回答:没有。
JDO定义了有效的PK类型,什么是“P”?就类而言,它是对象(即(java.lang.)对象,因为它没有真正的类型)。JPA也没有为此定义它。您列出的JPA示例与您尝试做的不同。请注意,抽象类AbstractEntity没有声明ID字段。这就留给实现子类了。@JamesB:谢谢。你的答案正是我想要的解释。我只是一个试图学习持久性的新手。我认为你的回答是肯定的,因为我的问题是关于类型擦除。非常感谢。如果您参与了@DataNucleus项目,也要感谢您提供了出色的持久性平台,以及您可以回答有关它的问题。这是一个令人生畏的对话(声望6对7130)。