Ошибка JDO / Datanucleus: поле "..." объявлено как ссылочный тип (интерфейс / объект), но классы реализации "..." не найдены? - PullRequest
0 голосов
/ 24 октября 2011

Я новичок в спецификации JDO и реализациях Datanucleus, и сейчас я борюсь в своем Проекте с ошибкой, описанной выше.

Какие шаги приведут к воспроизведению Проблемы:

1-Определение класса "DefaultDiffTask":

`@ PersistenceCapable открытый класс DefaultDiffTask реализует IDiffTask, Serializable {@Persistent protected IDiffTaskTarget diffTaskTarget;@Persistent protected String diffTaskId;

protected IDiffTaskPhasesMgr diffTaskPhasesMgr;

@Persistent
protected IDiffTaskType diffTaskType;

@Persistent
protected String taskCreationTime;

public DefaultDiffTask() {

this.diffTaskTarget = new DefaultDiffTaskTarget(
    new DefaultPageStateLocation(""), new DefaultPageStateLocation(
        ""));
this.diffTaskPhasesMgr = new DefaultDiffTaskPhasesMgr(this); //
DiffTaskUtility.createTaskPhasesMgr(this);
this.diffTaskType = new DefaultDiffTaskType(
    DiffTaskTypeEnum.CRAWLER_BASED_DIFF);
this.taskCreationTime = (new Date()).toString();
this.diffTaskId = this.generateDiffTaskId();

}

public DefaultDiffTask(IDiffTaskTarget diffTaskArea,
    IDiffTaskType diffTaskType) {
this.diffTaskTarget = diffTaskArea;
this.diffTaskPhasesMgr = new DefaultDiffTaskPhasesMgr(this); // DiffTaskUtility.createTaskPhasesMgr(this);
this.diffTaskType = diffTaskType;
this.taskCreationTime = (new Date()).toString();
this.diffTaskId = this.generateDiffTaskId();
}
...........`    

2 - попытаться получить ранее сохраненный объект с помощью:

PersistenceManagerFactory pmf = JDOHelper
    .getPersistenceManagerFactory(.....);
// Persistence of a Product and a Book.
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
    tx.begin();
    System.out.println("Retrieving Extent for Default");
    Extent e = pm.getExtent(DefaultDiffTask.class, true);
    Iterator iter = e.iterator();
    while (iter.hasNext()) {
    Object obj = iter.next();
    System.out.println(">  "
        + ((DefaultDiffTask) obj).getDiffTaskId());
    }
    tx.commit();
} catch (Exception e) {
    System.out.println("Exception thrown during retrieval of Extent : "
        + e.getMessage());
} finally {
    if (tx.isActive())
    tx.rollback();
    pm.close();
}

ожидаемый вывод:

Получение экстента по умолчанию:что-то здесь

Но я получаю следующее исключение:

Retrieving Extent for Default Exception thrown during retrieval of Extent : Field "net.she.sw.diff2w3c.diff.tsk.DefaultDiffTask.diffTaskTarget" is declared as a reference type (interface/Object) but **no implementation classes** of "net.she.sw.diff2w3c.diff.tsk.target.IDiffTaskTarget" have been found!

Моя точка зрения, у меня есть некоторая реализация интерфейса net.she.sw.diff2w3c.diff.tsk.DefaultDiffTask.diffTaskTarget с пометкой "@PersistenceCapable", такой как:

@PersistenceCapable
public class DefaultDiffTaskTarget extends AbstractDiffTaskTarget {
public DefaultDiffTaskTarget(IDiffTaskTargetStateLocation firstLocation,
    IDiffTaskTargetStateLocation secondLocation) {
super(firstLocation, secondLocation);
// TODO Auto-generated constructor stub
}

или

@PersistenceCapable
public class DefaultDiffTaskTarget extends AbstractDiffTaskTarget {

или

@PersistenceCapable
public class PageAreaTarget extends AbstractDiffTaskTarget {

, этот объект внедряется вконструкторы (по умолчанию и пользовательские), когда создается DefaulfDiffTask ...

, поэтому моя точка зрения

  • Почему эта ошибка?
  • это то, что мне не хватает?
  • все реализации реализаций интерфейса IDiffTaskTargetare присутствуют в пути к классу И имеют аннотации для работы JDO / Datanucleus

я знаю, что проблема в моем коде ине на стороне JDO / Datanuclи буду благодарен за любую помощь

1 Ответ

1 голос
/ 24 октября 2011

Как DataNucleus узнает о других ваших классах?Вы ожидаете, чтобы угадать, где они находятся?Почему бы просто не указать их в соответствии с документами http://www.datanucleus.org/products/accessplatform/jdo/orm/interfaces.html

...