简体   繁体   English

春季:独立实体通过以持久化

[英]Spring : detached entity passed to persist

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. 尝试在2个实体之间创建关系时遇到此错误,这次我以不同的方式进行此操作-将带有2个对象的JSON传递到helper类中,然后获取这些对象并持久保存它们并设置该关系。 When i remove setters of relation : 当我删除关系的二传手时:

1. newPerson.setKoordynator(koordynatorzyPraktykEntity); 1. newPerson.setKoordynator(koordynatorzyPraktykEntity);

2.koordynatorzyPraktykEntity.setKoordynatorByIdOsoby(newPerson); 2.koordynatorzyPraktykEntity.setKoordynatorByIdOsoby(newPerson);

then it is persisting both entities without a problem, with setters only first one (KoordynatorzyPraktykEntity) is persisted (idKoordynatora = 1, idOsoby =0, test = test ) 然后它将持久化两个实体,而不会出现问题,仅使用setter会持久化两个实体(koordynatorzyPraktykEntity)(idKoordynatora = 1,idOsoby = 0,test = test)

Here is the important part of error from POSTMAN ( full log http://pastebin.com/SRmnPMBH ) 这是POSTMAN错误的重要部分(完整日志http://pastebin.com/SRmnPMBH

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

KoordynatorzyEntity: KoordynatorzyEntity:

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

OsobyEntity: 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 : KoordynatorzyPraktykService:

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

Both DAOs have em.persist(entity) 两个DAO都有em.persist(entity)

and POST of KoordynatorzyPraktykController: 和KoordynatorzyPraktykController的POST:

{
    "koordynator":
    {
        "doTestow" : "test"
    },
    "osoba":
    {
    "tytulZawodowy" : "inzynier",
    "imie" : "Tomasz",
    "nazwisko" : "Potempa",
    "email" : "tp@tp.pl",
    "telefonKomorkowy" : "124675484",
    "telefonStacjonarny" : "654786484"
    }
}

Helper Class Koordynator: 助手类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; } } 

and this is parsed JSON into controller through POSTMAN 这是通过POSTMAN将JSON解析为控制器的

 { "koordynator": { "doTestow" : "test" }, "osoba": { "tytulZawodowy" : "inzynier", "imie" : "Tomasz", "nazwisko" : "Potempa", "email" : "tp@tp.pl", "telefonKomorkowy" : "124675484", "telefonStacjonarny" : "654786484" } } 

Only way I got it work 只有这样我才能工作

Class A: A类:

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

Class B: B级:

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

private String test;

Service: 服务:

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

you hit the exception below simply because the entity isn't in the Entity Manager's session at the moment you are trying to persist it. 您之所以遇到以下异常,仅是因为您在尝试持久保存实体时该实体不在实体管理器的会话中。 That's due to laziness of your association. 那是由于您的协会懒惰。

"detached entity passed to persist: praktyki.core.entities.KoordynatorzyPraktykEntity;" “传递给持久对象的独立实体:praktyki.core.entities.KoordynatorzyPraktykEntity;”

Try calling em.merge() to attach it to the session. 尝试调用em.merge()将其附加到会话。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM