Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:分离的实体传递给persist_Java_Json_Spring_Hibernate_Jpa - Fatal编程技术网

Java Spring:分离的实体传递给persist

Java Spring:分离的实体传递给persist,java,json,spring,hibernate,jpa,Java,Json,Spring,Hibernate,Jpa,我在尝试创建两个实体之间的关系时遇到了这个错误,这次我是以不同的方式执行的-将带有2个对象的JSON传递到helper类中,然后获取这些对象并将它们一个一个地持久化,然后设置关系。当我删除关系的setter时:1。newPerson.setKoordynator(koordynatorzyPraktykEntity); 2.Koordynatorzypraktykenty.setKoordynatorByIdOsoby(newPerson) 然后,它将毫无问题地持久化这两个实体,设置程序只会持久

我在尝试创建两个实体之间的关系时遇到了这个错误,这次我是以不同的方式执行的-将带有2个对象的JSON传递到helper类中,然后获取这些对象并将它们一个一个地持久化,然后设置关系。当我删除关系的setter时:1。newPerson.setKoordynator(koordynatorzyPraktykEntity); 2.Koordynatorzypraktykenty.setKoordynatorByIdOsoby(newPerson) 然后,它将毫无问题地持久化这两个实体,设置程序只会持久化第一个实体(KoordynatorzyPraktykEntity)(idKoordynatora=1,idOsoby=0,test=test)

以下是邮递员错误的重要部分(完整日志)

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;
    }
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(实体) Koordynatorzypraktyk控制员职务:

   @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);
        }
    }
这是通过邮递员解析到控制器的JSON

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

您遇到下面的异常仅仅是因为在您尝试持久化实体时,该实体不在实体管理器的会话中。那是因为你们协会的懒惰

“传递给persist的分离实体:praktyki.core.entities.KoordynatorzyPraktykEntity;”

尝试调用em.merge()将其附加到会话中。

这是使其工作的唯一方法

A类:

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

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);
A A=新A();
//没有孩子的创造
创建(a);
//项目
列表=新的ArrayList();
B=新的B();
b、 塞特斯特(“你好”);
b、 刚毛(a);
列表.添加(b);
//合并
a、 立管局(名单);
编辑(a);

尝试添加到控制器ikoordynatorzyPraktykDAO.merge(koordynatorzypraktykenty)的最后一行;现在的错误是“请求处理失败;嵌套异常为javax.persistence.EntityNotFoundException:找不到id为0的praktyki.core.entities.OsobyEntity”,这意味着通过此合并,他希望通过关系获取信息,但仍然无法持久化第二个实体(osoby)。我将尝试将int idOsoby更改为Integer并将其设置为null,这可以解决所有问题。是的,使用idOsoby=null进行操作,首先我将其idOsoby设置为null,然后通过REST“{idOfCoordinator}/person”将person持久化到idOfCoordinator的顶部,并在两侧设置关系。谢谢你的帮助。
{
    "koordynator":
    {
        "doTestow" : "test"
    },
    "osoba":
    {
    "tytulZawodowy" : "inzynier",
    "imie" : "Tomasz",
    "nazwisko" : "Potempa",
    "email" : "tp@tp.pl",
    "telefonKomorkowy" : "124675484",
    "telefonStacjonarny" : "654786484"
    }
}
@OneToMany(cascade = CascadeType.MERGE)
private List<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);