I want to save both child and parent entities whenever a POST call is made. I have an Item entity with a one to one mapping to a parent table Attribute:
@Entity @Table(name="Item") @JsonIgnoreProperties(ignoreUnknown = true) public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Long id; @OneToOne(fetch=FetchType.LAZY) @JoinColumn(name="attr_id") private Attribute attribute; @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval=true) private List<ValueSet> valueSets = new ArrayList<>(); // Other fields, getters, setters, overriding equals and hashcode using Objects.equals() and Objects.hashCode() for all the fields, helper for adding and removing ValueSet } The Attribute entity looks like this:
@Entity @Table(name="Attribute") @JsonIgnoreProperties(ignoreUnknown = true) public class Attribute { @Id @Column(name="id") private Long id; // Other fields, getters, setters, NOT overriding equals hashCode } Whenever an Item gets saved I need the Attribute to get saved as well. I've my postman sending JSON POST data as follows:
{ "attribute":{ "id":"6" }, "valueSets":[ { "value":"basic" } ] } My handler looks like this:
@PostMapping("/item") public void postItems(@RequestBody Item item) { itemRepository.save(item); } ItemRepository is just a one liner with @Repository annotation:
public interface ItemRepository extends CrudRepository<Item, Long>
When I try to save the Item I run into - Cannot insert the value NULL into column 'attr_id', table 'Item'; column does not allow nulls. INSERT fails.
I can't figure out why is it unable to take the id value of 6 that I am supplying as part of my POST invocation. The id value 6 already exists on the Attribute table. I have also tried making the relationship bi-directional using mappedBy and CASCADE.ALL but still get the same error.
Any thoughts/suggestions on what I'm messing/missing? Also, is there a better approach to handle nested entities? Should I try to save each of them individually? In that case can the @RequestBody still be the parent entity?