尝试在2个实体之间创建关系时遇到此错误,这次我以不同的方式进行此操作-将带有2个对象的JSON传递到帮助器类中,然后获取那些对象并持久化它们并设置该关系。当我删除关系的设定者时:1. newPerson.setKoordynator(koordynatorzyPraktykEntity);
2.koordynatorzyPraktykEntity.setKoordynatorByIdOsoby(newPerson);
然后它将持久化两个实体,而不会出现问题,仅使用设置器就可以持久化第一个(KoordynatorzyPraktykEntity)(idKoordynatora = 1,idOsoby = 0,test = test)

这是POSTMAN错误的重要部分(完整日志http://pastebin.com/SRmnPMBH

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)


KoordynatorzyEntity:

@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<KoordynatorzyKierunkowiEntity> 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<KoordynatorzyKierunkowiEntity> getKoordynatorzyByIdKierunku() {
        return koordynatorzyByIdKierunku;
    }

    public void setKoordynatorzyByIdKierunku(Collection<KoordynatorzyKierunkowiEntity> koordynatorzyByIdKierunku) {
        this.koordynatorzyByIdKierunku = koordynatorzyByIdKierunku;
    }


OsobyEntity:

@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;
    }


KoordynatorzyPraktykService:

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;
    }



两个DAO都有em.persist(entity)

和KoordynatorzyPraktykController的POST:

   @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<KoordynatorzyPraktykEntity> addCoordinator(@RequestBody Koordynator newCoordinator) {
        KoordynatorzyPraktykEntity addCoordinator = ikoordynatorzyPraktykService.addCoordinator(newCoordinator.getKoordynator());
        OsobyEntity addPerson = ikoordynatorzyPraktykService.addPerson(newCoordinator.getOsoba(), addCoordinator);
        if (addCoordinator !=null && addPerson !=null) {
            return new ResponseEntity<KoordynatorzyPraktykEntity>(addCoordinator, HttpStatus.OK);
        }
        else {
            return new ResponseEntity<KoordynatorzyPraktykEntity>(HttpStatus.NOT_FOUND);
        }
    }


助手类Koordynator:

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;
    }
}


这是通过POSTMAN将JSON解析为控制器的

{
    "koordynator":
    {
        "doTestow" : "test"
    },
    "osoba":
    {
    "tytulZawodowy" : "inzynier",
    "imie" : "Tomasz",
    "nazwisko" : "Potempa",
    "email" : "[email protected]",
    "telefonKomorkowy" : "124675484",
    "telefonStacjonarny" : "654786484"
    }
}

最佳答案

只有这样我才能工作

A类:

@OneToMany(cascade = CascadeType.MERGE)
private List<B> b;


B级:

@ManyToOne
@JoinColumn(name = "aId", referencedColumnName = "id")
private A a;

private String test;


服务:

A a = new A();

//Create without children
aFacade.create(a);

//items
List<B> list = new ArrayList<>();
B b = new B();
b.setTest("Hello");
b.setA(a);
list.add(b);

//merge
a.setB(list);
aFacade.edit(a);

07-24 15:03