Подтвердить что ты не робот

Непустое свойство ссылается на переходное значение - переходный экземпляр должен быть сохранен до текущей операции

У меня есть 2 модели домена и один Spring контроллер REST, как показано ниже:

@Entity
public class Customer{

@Id
private Long id;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="COUNTRY_ID", nullable=false)
private Country country;

// other stuff with getters/setters

}

@Entity
public class Country{

@Id
@Column(name="COUNTRY_ID")
private Integer id;

// other stuff with getters/setters

}

Spring Контроллер REST:

@Controller
@RequestMapping("/shop/services/customers")
public class CustomerRESTController {

   /**
    * Create new customer
    */
    @RequestMapping( method=RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    @ResponseBody
    public com.salesmanager.web.entity.customer.Customer createCustomer(@Valid @RequestBody   Customer customer, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {

        customerService.saveOrUpdate(customer);

        return customer;
    }

    // other stuff
}

Я пытаюсь вызвать службу REST выше с JSON как тело:

{
    "firstname": "Tapas",
    "lastname": "Jena",
    "city": "Hyderabad",
    "country": "1"
}

Если код страны 1 уже присутствует в таблице Country. Проблема в том, что я вызываю эту услугу ниже ошибки:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: com.test.model.Customer.country -> com.test.model.Country; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: com.test.model.Customer.country -> com.test.model.Country

Любая помощь будет оценена!

4b9b3361

Ответ 1

Попробуйте поставить CascadeType.ALL

@OneToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name="COUNTRY_ID", nullable=false) 

private Country country;

Ответ 2

У меня была аналогичная проблема. Два объекта: Документ и Статус. Документ имел отношение OneToMany с Статус, которое представляло историю Статус Документ.

Итак, была ссылка @NotNull @ManyToOne Документ внутри Статус.

Кроме того, мне нужно было узнать фактическое Статус документа . Итак, мне нужны были другие отношения, на этот раз @OneToOne, также @NotNull, внутри Документ.

Проблема заключалась в следующем: как перенести оба объекта в первый раз, если у обоих была ссылка @NotNull на другую?

Решение: удалить ссылку @NotNull из ссылки actualStatus. Таким образом, он смог сохранить оба объекта.