私は2つのドメインモデルと1つのSpring REST Controller of below:
@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
}
春REST Controller:
@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がすでに存在する場合、国テーブルにあります。問題は、このサービスを呼び出しているときにエラーが発生することです:
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
どんな助けも感謝します!
CascadeType.ALLを入れてみてください
@OneToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name="COUNTRY_ID", nullable=false)
private Country country;
同様の問題がありました。 2つのエンティティ:ドキュメントおよびステータス。 ドキュメントは、ステータスとの関係OneToMany
を持ち、これはステータスの履歴を表しましたドキュメント持っていました。
そのため、@NotNull
@ManyToOne
ドキュメント内部ステータスの参照。
また、実際のStatus of Documentを知る必要がありました。だから、私は別の関係が必要でした、今回は@OneToOne
、また@NotNull
、内部ドキュメント。
問題は、両方のエンティティが@NotNull
他への参照?
解決策は:remove @NotNull
actualStatus
参照からの参照。これにより、両方のエンティティを永続化できました。
変更する必要があります:
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="COUNTRY_ID", nullable=false)
private Country country;
に:
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="COUNTRY_ID")
private Country country;
ヌル可能設定を削除するだけです。