Ошибка: отключенный объект передан для сохранения - попробуйте сохранить сложные данные (Play-Framework)

У меня проблема с сохранением данных через play-framework. Может быть, добиться такого результата невозможно, но было бы здорово, если бы это сработало.

] Простой : У меня сложная Модель (Магазин с адресами), и я хочу сразу изменить магазин с адресами и хранить их таким же образом (магазин.спасти()). Но возникает ошибка отключенный объект, переданный для сохранения .

История обновлений 05.11

  • 05.11

    • Обновить Model Shop с атрибутом mappedBy = "shop"
    • обновить ссылку на группу пользователей Google
  • 09.11

    • найти обходной путь, но это не общий
  • 16.11

    • пример обновления html-формы, благодаря @Pavel
    • обходной путь обновления (обновление 09.11) до универсального метода, благодаря @ mericano1
  • 21.11 {{1} }
    • Я отказался от попыток найти решение и ждал игры 2.0 ...

Дейл : Я стараюсь сократить проблему до минимума: { {1}}
Модель :

@Entity
public class Shop extends Model {

    @Required(message = "Shopname is required")
    public String shopname;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="shop")
    public List
addresses; }


@Entity
public class Address extends Model {

    @Required
    public String location;

    @ManyToOne
    public Shop shop;
}

теперь мой Frontendcode :

#{extends 'main.html' /}

#{form @save(shop?.id)}

    

    #{field 'shop.shopname'}
        
        
    #{/field}

    Addressen
    #{list items: shop.addresses, as: "address"}
        
        
        
    #{/list}

     
#{/form}

У меня есть только идентификатор из самого магазина и название магазина, которое нужно отправить через POST, например: ? shop.shopname = foo

Промежуточная часть - это список адресов, и там у меня есть идентификатор и местоположение из адреса, и результат будет примерно таким: ? shop.shopname = foo & shop.addresses [0] .id = 1 & shop.addresses [0] .location = bar .

Теперь часть Контроллера для данных:

public class Shops extends CRUD {

public static void form(Long id) {

    if (id != null) {
        Shop shop = Shop.findById(id);
        render(shop);
    }
    render();
}

public static void save(Long id, Shop shop) {

    // set owner manually (dont edit from FE)
    User user = User.find("byEmail", Security.connected()).first();
    shop.owner = user;

    // Validate
    validation.valid(shop);
    if (validation.hasErrors()) 
        render("@form", shop);

    shop.save();
    index();
}

Теперь проблема : Когда я меняю данные адреса, код достигает shop.save (); магазин объектов заполнен всеми данными, и все выглядит нормально, но когда спящий режим пытается сохранить данные, возникает ошибка отключенный объект, переданный для сохранения :(

Я попытался изменить режим выборки , cascadetype и я также попробовали:

Shop shop1 = shop.merge();
shop1.save();

К сожалению, ничего не сработало, либо возникает ошибка, либо адресные данные не сохраняются. Есть ли способ хранить данные таким образом?

Если что-то неясно, напишите мне, я буду рад предоставить как можно больше информации.

Обновление 1 Я также поместил проблему в группу пользователей Google

Обновление 2 + 3 С помощью группы пользователей (спасибо to bryan w.) и ответ от mericano1 здесь я нашел общий обходной путь.

Сначала необходимо удалить cascade = CascadeType.ALL из атрибутов адресов в shop.class. Затем вам нужно изменить метод save в store.class.

public static void save(Long id, Shop shop) {

    // set owner manually (dont edit from FE)
    User user = User.find("byEmail", Security.connected()).first();
    shop.owner = user;

    // store complex data within shop
    storeData(shop.addresses, "shop.addresses");
    storeData(shop.links, "shop.links");

    // Validate
    validation.valid(shop);
    if (validation.hasErrors()) 
        render("@form", shop);

    shop.save();
    index();
}

общий метод хранения данных выглядит так:

private static  void  storeData(List list, String parameterName) {
    for(int i=0; i

Я добавил в Shop.class список ссылок , но я не буду обновлять другие фрагменты кода, поэтому будьте осторожны при компиляции возникают ошибки.

10
задан wattostudios 6 May 2012 в 03:22
поделиться