spring - Persist OneToOne relation with SpringData JPA -


i have next 2 entities onetoone relation between them:

@entity @table(name = "tasks") public class task {     @onetoone(mappedby = "task", cascade = cascadetype.persist)     private tracker tracker;      /* more code */ }  @entity @table(name = "trackers") public class tracker {     @onetoone     @joincolumn(name = "trk_task", unique = true)     private task task;      /* more code */ } 

i'm trying run code:

task task = taskservice.finddispatchabletask(); if (task != null) {     tracker tracker = trackerservice.findidletracker();     if (tracker != null) {         task.settracker(tracker);         task.setstatus(taskstatus.dispatched);         taskservice.save(task);     } } 

but error:

error org.hibernate.assertionfailure  - assertion failure occured (this may indicate bug in hibernate, more due unsafe use of session)  org.hibernate.assertionfailure: non-transient entity has null id 

i can "solve" changing code to:

task task = taskservice.finddispatchabletask(); if (task != null) {     tracker tracker = trackerservice.findidletracker();     if (tracker != null) {         tracker.settask(task);         trackerservice.save(tracker);         task.settracker(tracker);         task.setstatus(taskstatus.dispatched);         taskservice.save(task);     } } 

my question is, proper way persist onetoone relation? in code, why have save both parts of relation make work?

here go again.

every bidirectional association has 2 sides : owner side, , inverse side. inverse side 1 has mappedby attribute. owner side other one. jpa/hibernate cares owner side. if initialize inverse side, association won't persisted.

it's practice, generally, initialize both sides of association. first because makes sure owner side initialized, , second because makes graph of entities coherent, own good.

also note if you're working inside transaction (and should), entities returned queries attached entities. changes applied entities automatically made persistent when transaction committed (or before). there no need save entities explicitely you're doing.


Comments

Popular posts from this blog

Perl - how to grep a block of text from a file -

delphi - How to remove all the grips on a coolbar if I have several coolbands? -

javascript - Animating array of divs; only the final element is modified -