データベースから詳細ビューを作成する際に問題があります。
application.xml スニペット:
<module name="ModuleB">
<model name="B"/>
<view name="ViewB"/>
...
<mode-controller name="DetailOnly"/>
</module>
3 つのエンティティ クラスがあります。
@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) のレコードが DB から読み込まれ、画面に正しく表示されますが、Collection ViewC を編集しようとするとエラー メッセージが表示されます (例: 新しいエントリを追加する): 「保存アクションを実行できません: 作成できません: そのキーを持つオブジェクトは既に存在します」 + 以前と同様: 保存アクションで getView().getEntity().getCs() コレクションが null