【问题标题】:Can DataNucleus persist an abstract base class parameterized with Generics?DataNucleus 可以持久化使用泛型参数化的抽象基类吗?
【发布时间】:2012-07-25 21:35:09
【问题描述】:

使用 DataNucleus,我很高兴使用抽象基类为子类提供“长”ID(请注意原始类型)。

在调整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 类型“Long”,因此子类声明如下:

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>

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

【问题讨论】:

  • 您列出的 JPA 示例与您尝试执行的操作不同。请注意,抽象类 AbstractEntity 没有声明 ID 字段。这留给实现的子类。
  • @JamesB:谢谢。你的答案就是我要找的解释。

标签: java generics jdo datanucleus type-erasure


【解决方案1】:

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

【讨论】:

  • 我只是一个尝试学习持久性的新手。对于我关于类型擦除的问题,我会将您的回答视为是。谢谢你。如果您参与了@DataNucleus 项目,还要感谢您提供了出色的持久性平台以及您可以回答有关它的问题。这是一个令人生畏的对话(声望 6 与声望 7,130)。
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多