Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение списка сущностей в JPA 
:(
    Опции темы
oson
Дата 20.1.2013, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Подскажите пожалуйста в чем проблема
Код

@Entity
public class Person
{
    @OneToMany(mappedBy = "person",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    private List<Address> addresses = new ArrayList<Address>();
}

@Entity
public class Address
{
    @ManyToOne(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,CascadeType.MERGE},optional = true)
    @JoinColumn(name = "PERSON_ID",nullable = true)
    private Person person;
}



На странице есть возможность выбрать список имеющихся в базе адресов, затем создать Person, присвоить ему список адресов и затем сохранить этиот новый Person со списком адрресов, которые не новые, а считанные из базы в предыдущей транзакции. 
То есть List<Address> addresses уже есть в бд, но они считываются в отдельной транзакции. 

Код

@Service("addressService")
@Repository
@Transactional
class AddressService
{
     @Autowired
    AddressRepository addressRepository;
    
   @Transactional(readOnly = true)
    public List<Address> findAllAddresses
    {
      return addressRepository.findAll();
    }
}



Затем создается Person, в другом классе и в другой транзакции
 
Код

@Service("personService")
 @Repository
 @Transactional
  class PersonService
  {
     @Autowired
     PersonRepository personRepository;

     public Person save(String name, List<Address> addresses)
     {
           Person person = new Person();
           person.setName(name);
           person.setAddresses(addresses);
           personRepository.save(person) 
     }

   } 



И вот когда я хочу сохранить person, выпадает exception - detached entity passed to persist occurs

Для того, чтобы этого избежать, приходится после создания Person делать 
Код

personServise.save(person)


то есть сохранить его в одной транзакции, затем добавить adreses в persion
Код

 person.setAddresses(addresses)


затем снова вызвать 
Код

personServise.save(person) 



Почему так получается? в чем проблема - почему не сохраняется person с добавленными адресами за раз?
Спасибо.
PM MAIL   Вверх
mbasil
Дата 23.1.2013, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Возможно потому, что mappedBy ставится на инверсной стороне,
то есть подчиненной. Таким образом основной стороной в такой
конструкции считается не Person, а Address.
PM MAIL   Вверх
oson
Дата 28.2.2013, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.