0

这可能与我几天前的问题有关,但我什至不确定如何解释这部分。(这是完全不同的亲子关系。)

在我的界面中,我有一组属性(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 集中返回一个额外的条目——一个空值,因此,下次我遍历这些值时显示,它在中间显示一个额外的空白值。我已经确认这发生在合并或查找时,在“执行查询 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 对象,然后遍历以丢弃任何修改为“”(空字符串)值的对象。

到达数据管理器后,我尝试分两步删除:

  • a) 合并,它向数据库中的对象发送更新,将值设置为“”。
  • b) 删除发送删除的合并对象。

在这个序列中,下次我得到 Attribute 对象时,由于某种原因,集合中多了一个空值。如果我得到所有 ValidValue 对象,则没有这样的问题。

我将其更改为执行以下操作:

  • a) 通过查找已移除对象的 ID 来获取新对象。
  • b) 移除那个新对象。

瞧,这解决了问题!(我会很感激任何关于我所做的事情完全错误的评论,并且会导致问题,但现在,它有效。)

于 2010-05-02T19:21:10.763 回答