0

データベースから詳細ビューを作成する際に問題があります。

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

4

1 に答える 1

0

OpenXava は、コレクションの getter を呼び出すだけでなく、JPQL を使用してコレクション データを取得します。これは、フィルタリングと順序付けを可能にするためです。ここでの問題は、OpenXava によって生成されたクエリ文はデータを取得しますが、JPA エンティティの getter は取得しないことです。確かに JPA/Hibernate は、別の型への参照への mapsyBy にあまり満足していません。それはあなたが書くことです:

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

ここで、a は A への参照であり、B への参照ではありません。A と B が同じテーブルをマップすることを考えると、エンティティを 1 つだけ使用しないのはなぜでしょうか?

于 2016-12-19T13:16:45.457 に答える