2012-07-25 68 views
1

使用DataNucleus,我很高兴使用抽象基类为子类提供“长”ID(请注意原始类型)。DataNucleus是否可以坚持使用泛型参数化的抽象基类?

当适应example from 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类型“​​龙”,所以子类中声明是这样的:

public class Account extends VersionedIdEntity<Long> 

我切换到新的基类引起的错误,指出没有实施'java.lang.Object'被找到。

org.datanucleus.exceptions.NucleusUserException:字段“VersionedIdEntity.id”被声明为引用类型(接口/对象),但“java.lang.Object中”没有实现类已经找到了!

错误是否与类型删除有关?

其他问题将是:(1)如何JPA的处理操作和(2)我是否可以限制键入P types persistable in DataNucleus,如:

<? extends PersistableType> 

虽然我不能在其他地方找到帮助,问题之前可能会被问到。在这种情况下,一个简短的指针将不胜感激。

+1

您列出的JPA示例与您正在尝试执行的操作不同。请注意,抽象类AbstractEntity不会声明** ID字段。这留给实现的子类。 – JamesB 2012-07-25 21:55:32

+0

@JamesB:谢谢。你的回答是我正在寻找的解释。 – 2012-07-26 10:53:16

回答

2

你是说JDO定义了一个实现应该支持这个吗?答:不。 JDO定义了有效的PK类型,什么是“P”?就类而言,它是Object(即(java.lang。)Object,因为它没有实际的类型)。 JPA也没有为此定义它。

+2

我只是一个试图了解持久性的新手。我会将你的回答作为对我关于类型删除的问题的回答。谢谢。如果您参与了@DataNucleus项目,还要感谢您提供的这个优秀的持久性平台和您的可用性,以回答有关它的问题。这是一个令人生畏的对话(声望为6,声望为7,130)。 – 2012-07-26 11:00:57

+0

我怀疑这也适用于JPA,对不对? – 2016-06-21 12:33:38

相关问题