Сохранение списка сущностей в JPA

 
0
 
Java
ava
oson | 20.01.2013, 21: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 с добавленными адресами за раз?
Спасибо.
Kommentare (2)
ava
mbasil | 23.01.2013, 08:37 #
Возможно потому, что mappedBy ставится на инверсной стороне,
то есть подчиненной. Таким образом основной стороной в такой
конструкции считается не Person, а Address.
ava
oson | 28.02.2013, 12:46 #
Спасибо.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  oson   mbasil
advanced
Absenden