これは数日前の私の質問に関連しているかもしれませんが、この部分をどのように説明するかさえわかりません。(これはまったく異なる親子関係です。)
私のインターフェースには、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;
}