1

如何更新 Play 框架 2 和 ebean 中的多对多关系?我不断收到这样的错误:

[PersistenceException: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_field_event" Detail: Key (field_id, event_id)=(3, 21) already exists.]

我正在尝试使用表单选择哪些字段属于事件。我提交了一个包含字段列表的表单。id 属性是唯一填充的属性。然后我执行以下操作:

Event event = Event.find(eventId);
event.fields = fieldsForm.get().fields;
event.update();

我还尝试从数据库加载每个字段,将事件添加到其中,然后在该字段上调用 ​​update()。

这是我的课程:

注意:为简单起见,我删除了 Entity 和 Id 注释。

public class Event {
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "events")
        public List<Field> fields;
    }
}

public class Field {
    @ManyToMany(cascade = CascadeType.ALL)
    public List<Event> events;
}
4

3 回答 3

1

我不确定这是否是正确的方法,但它似乎可以解决问题。我只需要打电话updateFields()

public static void removeField(Long eventId, Long fieldId) {
    Event event = Event.find.setId(eventId).fetch("fields").findUnique();
    event.fields.remove(Field.find.ref(String.valueOf(fieldId)));
    event.saveManyToManyAssociations("fields");
}

public static void updateFields(Long eventId, List<Field> fields) {
    Event event = find.setId(eventId).fetch("fields").findUnique();

    for(Field field : event.fields) {
        removeField(eventId, field.id);
    }
    for (Field field : fields) {
        if (field.id != null) {
            event.fields.add(Field.find.ref(String.valueOf(field.id)));
        }
    }
    event.saveManyToManyAssociations("fields");
}
于 2013-01-18T05:59:52.970 回答
1

我有类似的问题。代替:

Event event = Event.find(eventId);
event.fields = fieldsForm.get().fields;
event.update();

我愿意

Event event = Event.find(eventId);
event.fields.clear();
event.fields.addAll(fieldsForm.get().fields);
event.update();

这就是诀窍。但是我仍在寻找更好的解决方案。

于 2014-04-14T08:16:48.540 回答
0

我把丹尼斯的解决方案放在一个通用函数中:

public static <T> void replaceItems(Function0<List<? super T>> fn,
                                    Collection<? extends T> newItems) {
    List<? super T> oldItems = fn.apply();
    oldItems.clear();
    oldItems.addAll(newItems);
}

像这样使用它:

replaceItems(event::fields, formFields.get().fields);

我传递了一个函数来帮助确保您以正确的顺序放置参数。此解决方案需要 Java 8+。

于 2017-03-22T22:22:25.343 回答