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 отображают одну и ту же таблицу, почему бы не использовать только одну сущность?