Получение TransientPropertyValueException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть однонаправленное отношение много-к-одному следующим образом:

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, все работает нормально.

...