使用 DataNucleus,我很高兴使用抽象基类为子类提供“长”ID(请注意原始类型)。
在改编来自 JPA 的示例时,我想到了参数化基类的想法。目的是支持不同的 ID 类型,例如 String。
@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;
}
}
泛型让我使用包装的 Java 类型“Long”,因此子类声明如下:
public class Account extends VersionedIdEntity<Long>
我切换到新的基类导致了一个错误,指出没有找到“java.lang.Object”的实现。
org.datanucleus.exceptions.NucleusUserException:字段“VersionedIdEntity.id”被声明为引用类型(接口/对象),但没有找到“java.lang.Object”的实现类!
错误与类型擦除有关吗?
其他问题是(1)JPA 如何处理它以及(2)我是否可以将类型 P 限制为DataNucleus中可持久的类型,例如:
<? extends PersistableType>
虽然我在其他地方找不到帮助,但这个问题之前可能已经问过。在这种情况下,将不胜感激简短的指针。