1

如何更新Play框架2和ebean中的多對多關係?我不斷收到這樣的錯誤:如何更新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()在球場上。

這裏是我的課:

注:我刪除的實體和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; 
} 

回答

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"); 
} 
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(); 

這做的伎倆。不過,我仍在尋找更好的解決方案。

+0

如果有更好的解決方案,它非常複雜。 – GlenPeterson

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+。