У меня проблема с сохранением данных через play-framework. Может быть, добиться такого результата невозможно, но было бы здорово, если бы это сработало.
] Простой : У меня сложная Модель (Магазин с адресами), и я хочу сразу изменить магазин с адресами и хранить их таким же образом (магазин.спасти()). Но возникает ошибка отключенный объект, переданный для сохранения
.
История обновлений 05.11
05.11
mappedBy = "shop"
09.11
16.11
Дейл :
Я стараюсь сократить проблему до минимума: { {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}
#{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 список ссылок , но я не буду обновлять другие фрагменты кода, поэтому будьте осторожны при компиляции возникают ошибки.