У меня есть однонаправленное отношение много-к-одному следующим образом:
public class Address {
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumns({
@JoinColumn(name = "first_id"),
@JoinColumn(name = "second_id")
})
private User user;
}
public class User {
@EmbeddedId
private UserId id;
private String email;
@Embeddable
public static class UserId implements Serializable {
private Long firstId;
private Long secondId;
}
}
И у меня есть служба, которая запускает первую транзакцию, запускает вторую транзакцию, сохраняет пользователя и возвращает обратно в первую транзакцию, сохраняет адрес следующим образом:
Служба 1:
@Transactional
public void addAddress(Address address, User user) {
User savedUser = service2.addUser(user);
address.setUser(savedUser);
repository.save(address);
}
Служба 2:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public User addUser(User user) {
return repository.save(user);
}
Проблема в том, что при вызове service1.addAddress (адрес, пользователь) я получаю TransientPropertyValueException. Каким-то образом сохраненный пользовательский объект попадает в переходное состояние. Разве он не должен находиться в отдельном объекте и сливаться при сохранении адреса. Я также указал каскад, чтобы объединить во многих отношениях один. Кто-нибудь знает, что здесь происходит?
Также, когда я изменяю каскад для всех, при добавлении адреса гибернация пытается спасти пользователя, а также в конечном итоге получает дубликат ошибки пользователя.
Обновление: когда я изменяю распространение транзакции по умолчанию в методе addUser, все работает нормально.