Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сохранение списка сущностей / 5 сообщений из 5, страница 1 из 1
13.01.2013, 01:39:27
    #38108070
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение списка сущностей
Есть две сущности

Person
{
List<Child> children
}

Child
{

}

На странице (это веб) можно сразу добавить в список несколько Child

То есть

Service
{
public void addChildren(List<Children> additionalChildren)
{

person.getChildren().addAll(additionalChildren)

}
}

Как правильно должен выполняться запрос? Достаточно добавить список additionalChildren и затем сохранить Person?
Или надо делать итерацию по списку additionalChildren и сохранять каждый?
У меня например каждый Child не содержит ссылку на Person, они соединяются через промежуточную таблицу.
И если эти additionalChildren были в предыдущей транзакции получены из БД, а в этой я пытаюсь их добавить в Person и сохранить, то выпадает exception

detached entity passed to persist
...
Рейтинг: 0 / 0
13.01.2013, 12:32:55
    #38108151
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение списка сущностей
osonНа странице (это веб) можно сразу добавить в список несколько Child
- "сразу" это не термин проектировщика. Сразу в одной физической транзакции или логической?
Обычно "сразу" - это когда импорт чилдрен (5 детей) из файла в систему.
Обычно "по одному" - это когда нажимаешь кнопку "Добавить" в ГУИ.
ЗЫ.
Т.к. веб "без состояния" , то по одному "проще и лучше".
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
13.01.2013, 12:34:16
    #38108154
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение списка сущностей
osonУ меня например каждый Child не содержит ссылку на Person, они соединяются через промежуточную таблицу.
уже говорил - приведи полный маппинг (можешь игнорировать)
...
Рейтинг: 0 / 0
20.01.2013, 19:48:06
    #38117026
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение списка сущностей
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@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 уже есть в бд, но они считываются в отдельной транзакции.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Service("addressService")
@Repository
@Transactional
class AddressService
{
     @Autowired
    AddressRepository addressRepository;
    
   @Transactional(readOnly = true)
    public List<Address> findAllAddresses
    {
      return addressRepository.findAll();
    }
}



Затем создается Person, в другом классе и в другой транзакции
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 @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 делать
Код: java
1.
personServise.save(person) 


то есть сохранить его в одной транзакции, затем добавить adreses в persion
Код: java
1.
 person.setAddresses(addresses)


затем снова вызвать
Код: java
1.
personServise.save(person) 



Почему так получается? в чем проблема - почему не сохраняется person с добавленными адресами за раз?
Спасибо.
...
Рейтинг: 0 / 0
21.01.2013, 08:23:47
    #38117337
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение списка сущностей
oson,
Либо многие ко многим с каскадом либо уберите каскад.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сохранение списка сущностей / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]