OpenXava, заполняющий коллекцию из базы данных

У меня проблема с заполнением подробного представления из базы данных.

фрагмент application.xml:

<module name="ModuleB">
        <model name="B"/>
        <view name="ViewB"/>
        ...
        <mode-controller name="DetailOnly"/>
</module>

У меня есть три класса сущностей:

@Entity
@Table(name="A")
class A {
    @OneToMany(mappedBy = "a")
    @ListProperties("col1")
    @CollectionView("cs")
    private Collection<C> cs;//+getter/setters
}

@Entity
@Table(name="A")
@View(name = "ViewB", ...)
class B {
    @OneToMany(mappedBy = "a")
    @ListProperties(...)
    @CollectionView("ViewC")
    private Collection<C> cs;//+getter/setters
}

@Entity
@Table(name="C")
@View(name = "ViewC", ...)
class C {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private A a;
}

Я хочу прочитать существующий экземпляр B из базы данных, щелкнув ссылку, а затем отредактировав / изменив ее. Когда я устанавливаю объект модели представления с помощью getView(). SetModel () или даже с помощью getView(). FindObject (), на экране все выглядит хорошо, коллекция показывает свой правильный контент. С другой стороны, когда я пытаюсь сохранить его обратно, в действии сохранения коллекция getView(). GetEntity(). GetCs() имеет значение null. Что я должен сделать, чтобы представление соответствовало сущности позади?

Я использую OpenXava 5.0.1, java 1.7 Важное примечание: мне не разрешено менять версию OpenXava, так как это устаревший проект.

Мое редактирование (20170126) Я создал новый класс, чтобы избежать проблем со ссылками:

@Entity
@Table(name="C")
@View(name = "ViewC", ...)
class D {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private B a;
}

and modified the class B accordingly:

@Entity
@Table(name="A")
@View(name = "ViewB", ...)
class B {
    @OneToMany(mappedBy = "a")
    @ListProperties(...)
    @CollectionView("ViewC")
    private Collection<D> cs;//+getter/setters
}

Но результат тот же: записи подпредставления (Collection ViewC) загружаются из БД и корректно отображаются на экране, но я получаю сообщение об ошибке, если хочу отредактировать Collection ViewC (например: добавить новую запись): "Невозможно выполнить действие сохранения: невозможно создать: объект с таким ключом уже существует" + Как и прежде: в действии сохранения коллекция getView(). GetEntity(). GetCs() имеет значение null.

1 ответ

OpenXava использует JPQL для получения данных коллекции вместо того, чтобы просто вызывать метод получения коллекции, это позволяет фильтровать и упорядочивать. Проблема здесь в том, что предложение запроса, сгенерированное OpenXava, получает данные, а получатель объекта JPA - нет. Конечно, JPA/Hibernate не очень доволен отображением ссылки на другой тип. То есть ты пишешь:

class B {
  @OneToMany(mappedBy = "a")
  @ListProperties(...)
  @CollectionView("ViewC")
  private Collection<C> cs;//+getter/setters
}

Где a является ссылкой на A, а не на B. Учитывая, что A и B отображают одну и ту же таблицу, почему бы не использовать только одну сущность?

Другие вопросы по тегам