1

Play Framework 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();

また、dbから各フィールドをロードし、それにイベントを追加してから、フィールドでupdate()を呼び出してみました。

これが私のクラスです:

注:わかりやすくするために、エンティティと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

同様の問題があります。それ以外の:

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 に答える
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 に答える