2016-12-16 1 views
0

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

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 
} 

Но результат те же: Записи о подвиде (Коллекция ViewC) загружается из базы данных, и отображается на экране правильно, но я получаю сообщение об ошибке, если я хочу отредактировать Collection ViewC (например: добавить новую запись): «Невозможно выполнить действие« Сохранить »: невозможно создать: объект с этим ключом уже существует » + Как и прежде: в действии сохранения getView(). ge tEntity() collection getCs() null

ответ

0

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

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

Если это ссылка на А, не В. Учитывая, что А и В на карте ту же таблицу, то почему бы не использовать только один объект?

+0

Я добавил дополнение к моему оригинальному вопросу. Есть ли у вас какие-либо идеи для решения в этом случае? Заранее спасибо! – SzGyD

+0

Я все еще думаю, что ваши цели не работают с JPA/Hibernate. Проверьте свои объекты без OpenXava, просто с классом с main(). Найдите основной объект с JPA и получите коллекцию. Это работает? – javierpaniza

Смежные вопросы