web-dev-qa-db-fra.com

La propriété non nulle fait référence à une valeur transitoire - l'instance transitoire doit être enregistrée avant l'opération en cours

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!

34
Tapas Jena

Essayez de mettre CascadeType.ALL

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

private Country country;
40
Raju Rudru

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.

14
djejaquino

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.

0
Miladesnovakaina