3

多対多(双方向)であるはずのリストがあります

これは Filter クラスです。

@ManyToMany(targetEntity=Serving.class)
@JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={
    @JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")})
private List<Serving> servings;
public List<Serving> getServing() { return this.servings; }
public void setServing(List<Serving> servings) { this.servings = servings; }

これはServingクラスです:

@ManyToMany(targetEntity=Filter.class)
    @JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={
        @JoinColumn(name="serving_id")}, inverseJoinColumns={@JoinColumn(name="filter_id")})
    private List<Filter> filters;
    public List<Filter> getFilters() { return filters;}
    public void setFilters(List<Filter> filters) { this.filters = filters;}

次に、サービングからすべてのフィルターを取得するために何かを呼び出すことになっていました。これが私が行うことです (サーブはサービング タイプです)。

List<Filter> filters = serv.getFilters();

//iterate from all filter
for(Filter allf : allFilter)
{
    boolean mark_this = false;
    //..and matched the currently-iterated-all-filters with filter from
    //which the serving got
    for(com.pos.model.Filter f : filters)
    {
        //if matched, mark this current filter
        if (allf.getId().equals(f.getId()))
            mark_this = true;
    }
    tmodel.addRow(new Object[] { allf.getName(), mark_this });
}

そのメソッドはモデルで定義されており、静的です。したがって、フォームが読み込まれると、 jTable.setTableModel(Filter.toTableModel(thisServing)); のように呼び出されます。

読み込み、データを表示しました。ただし、Hibernate は削除も呼び出します。

Hibernate: select filter0_.filter_id as filter1_2_, filter0_.is_showable as is2_2_, filter0_.name as name2_ from DIM_FILTER filter0_ where is_showable=true
Hibernate: select filters0_.serving_id as serving1_4_1_, filters0_.filter_id as filter2_6_1_, filter1_.filter_id as filter1_2_0_, filter1_.is_showable as is2_2_0_, filter1_.name as name2_0_ from BRIDGE_SERV_FILTER filters0_ inner join DIM_FILTER filter1_ on filters0_.filter_id=filter1_.filter_id where filters0_.serving_id=?
Hibernate: delete from BRIDGE_SERV_FILTER where serving_id=?

実際、私はまったく削除を行いませんし、休止状態に何かを削除するように依頼することもありません。理解できないことが起こるかもしれません... Hibernate が削除されないようにするにはどうすればよいですか? または私が間違ったことはありますか?

4

2 に答える 2

2

コードのどこかに、サービスのフィルター コレクションをクリアするか、このコレクションを null に設定する必要があります。Hibernate はこの変更を永続化します。

また、マッピングが間違っていることにも注意してください。これが、奇妙な動作が見られる理由です。双方向の ManyToMany を使用する代わりに、関連のない単方向の ManyToMany を 2 つ使用し、両方とも同じ結合テーブルを使用します。一方の側は、もう一方の側の反転として選択する必要があります。たとえば、フィルタ側をアソシエーションの所有者にしたい場合は、次のmappedBy属性を使用してサービング側を逆側としてマークする必要があります。

class Filter {
    @ManyToMany
    @JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={
    @JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")})
    private List<Serving> servings;
}

class Serving {
    @ManyToMany(mappedBy = "servings")
    private List<Filter> filters;
}

これについては、ドキュメントに記載されています。

于 2012-12-29T08:25:26.180 に答える
0

この問題は実際には8日前からすでに私を悩ませていたので、私は無力になりました.

問題は、list() を取得する方法にあります。だから...あなたがbi-di関係を持っているなら、次のようなことをしないでください:

Long id = getIdFromCombo();
Serving s = (Serving) session.getId(Serving.class, id).uniqueResult();

同時にフォームを次のように初期化した場合:

Public theFormName(Menu m){
  this.menu = m;
}

Menu が Serving を 1 対多として取得した場合は、セッションに対して Serving をクエリしない方がよいでしょう。次のように 1 つずつ一致させることをお勧めします。

Serving s;
for(int i=0; i<this.menu.getServings().size(); i++)
{
  if(equal code) s = menu.getServings().get(i);
}

そうすれば、上に挙げたような問題は発生しないはずです。これは奇妙です。落とし穴。誰かがこの問題に遭遇したことがあるのだろうか。これは私のせいなのか、バグなのか、よくわかりません。

Serving クラスに対して (Session の助けを借りて) クエリを実行するのが間違っている理由をまだ理解していないため、同時にサービングを配信できる menu.getServings() があります (しかし、より少ない視点で (どこでserving.menu.id = menu.id)でサービスを提供するので、とにかく、問題ではありません)

于 2012-12-29T14:24:22.637 に答える