Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Сохранение списка сущностей в JPA


Автор: oson 20.1.2013, 20:21
Подскажите пожалуйста в чем проблема
Код

@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 с добавленными адресами за раз?
Спасибо.

Автор: mbasil 23.1.2013, 08:37
Возможно потому, что mappedBy ставится на инверсной стороне,
то есть подчиненной. Таким образом основной стороной в такой
конструкции считается не Person, а Address.

Автор: oson 28.2.2013, 12:46
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)