1

使用 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>

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

4

1 回答 1

2

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

于 2012-07-26T06:28:30.653 回答