title: Spring : detached entity passed to persist
body: <p></p>
  I'm getting this errors when trying to create relation between 2 entities, this time i'm doing this in different way - passing JSON with 2 object into helper class and then getting those object and persisting them, one by one and setting the relation. When i remove setters of relation :<p> 1. newPerson.setKoordynator(koordynatorzyPraktykEntity);
  <p>2.koordynatorzyPraktykEntity.setKoordynatorByIdOsoby(newPerson); <p>
  then it is persisting both entities without a problem, with setters only first one (KoordynatorzyPraktykEntity) is persisted (idKoordynatora = 1, idOsoby =0, test = test )</p>
  
  <p>Here is the important part of error from POSTMAN ( full log <a href="http://pastebin.com/SRmnPMBH" rel="nofollow">http://pastebin.com/SRmnPMBH</a> )</p>
  
  <pre><code>org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: praktyki.core.entities.KoordynatorzyPraktykEntity; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: praktyki.core.entities.KoordynatorzyPraktykEntity
      org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
      org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
      org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  </code></pre>
  
  <p>KoordynatorzyEntity:</p>
  
  <pre><code>@Entity
  @Table(name = "koordynatorzy_praktyk", schema = "public", catalog = "praktykidb")
  public class KoordynatorzyPraktykEntity {
      private int idKoordynatoraPraktyk;
      private int idOsoby;
      private String doTestow;
  
      private OsobyEntity koordynatorByIdOsoby;
      private Collection&lt;KoordynatorzyKierunkowiEntity&gt; koordynatorzyByIdKierunku;
  
      @Id
      @GeneratedValue
      @Column(name = "id_koordynatora_praktyk")
      public int getIdKoordynatoraPraktyk() {
          return idKoordynatoraPraktyk;
      }
  
      public void setIdKoordynatoraPraktyk(int idKoordynatoraPraktyk) {
          this.idKoordynatoraPraktyk = idKoordynatoraPraktyk;
      }
  
      @Basic
      @Column(name = "id_osoby")
      public int getIdOsoby() {
          return idOsoby;
      }
  
      public void setIdOsoby(int idOsoby) {
          this.idOsoby = idOsoby;
      }
  
      /*
      STUFF
      */
  
      @JsonIgnore
      @OneToOne(cascade = CascadeType.ALL)
      @JoinColumn(name = "id_osoby", referencedColumnName = "id_osoby", insertable = false , updatable = false)
      public OsobyEntity getKoordynatorByIdOsoby() {
          return koordynatorByIdOsoby;
      }
  
      public void setKoordynatorByIdOsoby(OsobyEntity koordynatorByIdOsoby) {
          this.koordynatorByIdOsoby = koordynatorByIdOsoby;
      }
  
      @JsonIgnore
      @OneToMany(mappedBy = "koordynatorzyByIdKierunku", cascade = CascadeType.ALL)
      @LazyCollection(LazyCollectionOption.FALSE)
      public Collection&lt;KoordynatorzyKierunkowiEntity&gt; getKoordynatorzyByIdKierunku() {
          return koordynatorzyByIdKierunku;
      }
  
      public void setKoordynatorzyByIdKierunku(Collection&lt;KoordynatorzyKierunkowiEntity&gt; koordynatorzyByIdKierunku) {
          this.koordynatorzyByIdKierunku = koordynatorzyByIdKierunku;
      }
  </code></pre>
  
  <p>OsobyEntity:</p>
  
  <pre><code>@Entity
  @Table(name = "osoby", schema = "public", catalog = "praktykidb")
  public class OsobyEntity {
      private int idOsoby;
      private String tytulZawodowy;
      private String imie;
      private String nazwisko;
      private String email;
      private String telefonKomorkowy;
      private String telefonStacjonarny;
  
      private KoordynatorzyPraktykEntity koordynator;
  
      @Id
      @GeneratedValue
      @Column(name = "id_osoby")
      public int getIdOsoby() {
          return idOsoby;
      }
  
      public void setIdOsoby(int idOsoby) {
          this.idOsoby = idOsoby;
      }
  
      /*
       STUFF
      */
  
  
      @OneToOne(mappedBy = "koordynatorByIdOsoby", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
      public KoordynatorzyPraktykEntity getKoordynator() {
          return koordynator;
      }
  
      public void setKoordynator(KoordynatorzyPraktykEntity koordynator) {
          this.koordynator = koordynator;
      }
  </code></pre>
  
  <p>KoordynatorzyPraktykService :</p>
  
  <pre><code>public class KoordynatorzyPraktykService implements iKoordynatorzyPraktykService {
  
      @Autowired
      private iKoordynatorzyPraktykDAO ikoordynatorzyPraktykDAO;
  
      @Autowired
      private iOsobyDAO iosobyDAO;
  
      @Override
      public KoordynatorzyPraktykEntity addCoordinator(KoordynatorzyPraktykEntity koordynatorzyPraktykEntity) {
          return ikoordynatorzyPraktykDAO.addCoordinator(koordynatorzyPraktykEntity);
      }
  
      /*
      STUFF
      */
  
      @Override
      public OsobyEntity addPerson(OsobyEntity osobyEntity, KoordynatorzyPraktykEntity koordynatorzyPraktykEntity) {
          OsobyEntity newPerson = iosobyDAO.addPerson(osobyEntity);
          newPerson.setKoordynator(koordynatorzyPraktykEntity);
          System.out.println(koordynatorzyPraktykEntity.toString()); //shows idKoordynatora: 1 idOsoby: 0 test: test
          System.out.println(newPerson.toString()); //shows idOsoby: 32768 imie: Tomasz nazwisko: Potempa
          int idOsoby = newPerson.getIdOsoby();
          koordynatorzyPraktykEntity.setIdOsoby(idOsoby);
          System.out.println(koordynatorzyPraktykEntity.toString()); //shows idKoordynatora: 1 idOsoby: 32768 test: test
          koordynatorzyPraktykEntity.setKoordynatorByIdOsoby(newPerson);
          return newPerson;
      }
  </code></pre>
  
  <p><p>
  <strong>Both DAOs have em.persist(entity)</strong>
  <p>
  and POST of KoordynatorzyPraktykController:</p>
  
  <pre><code>   @RequestMapping(method = RequestMethod.POST)
      public ResponseEntity&lt;KoordynatorzyPraktykEntity&gt; addCoordinator(@RequestBody Koordynator newCoordinator) {
          KoordynatorzyPraktykEntity addCoordinator = ikoordynatorzyPraktykService.addCoordinator(newCoordinator.getKoordynator());
          OsobyEntity addPerson = ikoordynatorzyPraktykService.addPerson(newCoordinator.getOsoba(), addCoordinator);
          if (addCoordinator !=null &amp;&amp; addPerson !=null) {
              return new ResponseEntity&lt;KoordynatorzyPraktykEntity&gt;(addCoordinator, HttpStatus.OK);
          }
          else {
              return new ResponseEntity&lt;KoordynatorzyPraktykEntity&gt;(HttpStatus.NOT_FOUND);
          }
      }
  </code></pre>
  
  <p>Helper Class Koordynator:</p>
  
  <pre><code>public class Koordynator {
  
      private KoordynatorzyPraktykEntity koordynator;
  
      private OsobyEntity osoba;
  
      public KoordynatorzyPraktykEntity getKoordynator() {
          return koordynator;
      }
  
      public void setKoordynator(KoordynatorzyPraktykEntity koordynator) {
          this.koordynator = koordynator;
      }
  
      public OsobyEntity getOsoba() {
          return osoba;
      }
  
      public void setOsoba(OsobyEntity osoba) {
          this.osoba = osoba;
      }
  }
  </code></pre>
  
  <p>and this is parsed JSON into controller through POSTMAN</p>
  
  <pre><code>{
      "koordynator":
      {
          "doTestow" : "test"
      },
      "osoba":
      {
      "tytulZawodowy" : "inzynier",
      "imie" : "Tomasz",
      "nazwisko" : "Potempa",
      "email" : "tp@tp.pl",
      "telefonKomorkowy" : "124675484",
      "telefonStacjonarny" : "654786484"
      }
  }
  </code></pre>