0

これは数日前の私の質問に関連しているかもしれませんが、この部分をどのように説明するかさえわかりません。(これはまったく異なる親子関係です。)

私のインターフェースには、1対多の関係にあるそれぞれの属性(Attribute)と有効な値(ValidValue)のセットがあります。Spring MVCフロントエンドには、管理者がこれらの値を編集するためのページがあります。送信された後、これらのフィールドのいずれか(<input>タグとして)が空白の場合、次のようにValidValueオブジェクトを削除します。

Set<ValidValue> existingValues = new HashSet<ValidValue>(attribute.getValidValues());
Set<ValidValue> finalValues = new HashSet<ValidValue>();
for(ValidValue validValue : attribute.getValidValues()) {
    if(!validValue.getValue().isEmpty()) {
        finalValues.add(validValue);
    }
}

existingValues.removeAll(finalValues);
for(ValidValue removedValue : existingValues) {
    getApplicationDataService().removeValidValue(removedValue);
}
attribute.setValidValues(finalValues);
getApplicationDataService().modifyAttribute(attribute);

問題は、データベースが適切に更新されている間、次にAttributeオブジェクトをクエリすると、それらのValidValueセットに追加のエントリ(null)が返されるため、次に値を反復処理するときにディスプレイでは、中央に余分な空白の値が表示されます。これは、マージまたは検索の時点、「クエリReadObjectQuery(entity.Attribute)の実行」の時点で発生することを確認しました。

(ApplicationDataService内の)データベースを変更するために使用しているコードは次のとおりです。

public void modifyAttribute(Attribute attribute) {
    getJpaTemplate().merge(attribute);
}

public void removeValidValue(ValidValue removedValue) {
    ValidValue merged = getJpaTemplate().merge(removedValue);
    getJpaTemplate().remove(merged);
}

エンティティクラスの関連部分は次のとおりです。

Entity
@Table(name = "attribute")
public class Attribute {
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "attribute")
    private Set<ValidValue> validValues = new HashSet<ValidValue>(0);
}

@Entity
@Table(name = "valid_value")
public class ValidValue {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "attr_id", nullable = false)
    private Attribute attribute;
}
4

1 に答える 1

0

何時間ものランダムな実験によって修正された別の JPA の問題。うまくいけば、これは同じ種類の問題を抱えている他の誰かを助けるでしょう.

どうやら問題は、変更されたオブジェクトを削除しようとしていたことです。基本的に、私が行っていたのは、Spring フォームに ValidValue オブジェクトを直接変更させてから、値 "" (空の文字列) に変更されたものをすべて破棄するために繰り返し処理することでした。

それがデータマネージャーに到達したら、2つのステップで削除しようとしました:

  • a) データベース内のオブジェクトに更新を送信し、値を "" に設定する Merge。
  • b) 削除を送信したマージされたオブジェクトを削除します。

このシーケンスでは、次に Attribute オブジェクトを取得したときに、何らかの理由でセットに余分な null 値がありました。すべての ValidValue オブジェクトを取得した場合、そのような問題はありません。

代わりに次のように変更しました。

  • a) 削除されたオブジェクトの ID を検索して、新しいオブジェクトを取得します。
  • b) その新しいオブジェクトを削除します。

見よ、これで問題は解決した!(私がしたことが完全に間違っていて、今後問題につながることについてのコメントをいただければ幸いですが、今のところは機能しています。)

于 2010-05-02T19:21:10.763 に答える