J'ai 2 modèles de domaine et un Spring REST Controller comme ci-dessous:
@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:
@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
}
J'essaie d'appeler ci-dessus REST service avec ci-dessous JSON comme corps:
{
"firstname": "Tapas",
"lastname": "Jena",
"city": "Hyderabad",
"country": "1"
}
Lorsque le code de pays 1 est déjà présent dans le tableau des pays. Le problème est lorsque j'appelle ce service en dessous de l'erreur:
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
Toute aide serait appréciée!
Essayez de mettre CascadeType.ALL
@OneToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name="COUNTRY_ID", nullable=false)
private Country country;
J'avais un problème similaire. Deux entités: Document et Status. Document avait une relation OneToMany
avec Status, qui représentait l'historique de Status the Document had .
Donc, il y avait un @NotNull
@ManyToOne
référence de Document à l'intérieur Statut.
De plus, j'avais besoin de connaître le Status of Document. Donc, j'avais besoin d'une autre relation, cette fois @OneToOne
, également @NotNull
, à l'intérieur Document.
Le problème était: comment puis-je persister les deux entités la première fois si les deux avaient un @NotNull
référence à l'autre?
La solution était: supprimer @NotNull
référence de actualStatus
référence. De cette façon, il a pu faire persister les deux entités.
vous devez changer:
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="COUNTRY_ID", nullable=false)
private Country country;
à :
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="COUNTRY_ID")
private Country country;
supprimez simplement le paramètre nullable.