Java Spring:分离的实体传递给persist
我在尝试创建两个实体之间的关系时遇到了这个错误,这次我是以不同的方式执行的-将带有2个对象的JSON传递到helper类中,然后获取这些对象并将它们一个一个地持久化,然后设置关系。当我删除关系的setter时:1。newPerson.setKoordynator(koordynatorzyPraktykEntity); 2.Koordynatorzypraktykenty.setKoordynatorByIdOsoby(newPerson) 然后,它将毫无问题地持久化这两个实体,设置程序只会持久化第一个实体(KoordynatorzyPraktykEntity)(idKoordynatora=1,idOsoby=0,test=test) 以下是邮递员错误的重要部分(完整日志) KoordynatorzyEntity: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) 然后,它将毫无问题地持久化这两个实体,设置程序只会持久
@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);