Java 休眠保存对象(一对多关系)外键为空
我在个人等级和汽车等级之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用RESTfulAPI发布数据。我的annotations和Get服务工作正常,但每当我尝试插入新数据时,我的post服务就会抛出“Java 休眠保存对象(一对多关系)外键为空,java,hibernate,rest,jakarta-ee,http-post,Java,Hibernate,Rest,Jakarta Ee,Http Post,我在个人等级和汽车等级之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用RESTfulAPI发布数据。我的annotations和Get服务工作正常,但每当我尝试插入新数据时,我的post服务就会抛出“java.sql.SQLIntegrityConstraintViolationException:ORA-01400:cannotes insert NULL”错误。子表外键作为null插入 这是我的部分代码 Person.java private List<Car>
java.sql.SQLIntegrityConstraintViolationException:ORA-01400:cannotes insert NULL”错误。子表外键
作为null
插入
这是我的部分代码
Person.java
private List<Car> cars = new ArrayList<Car>();
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
@JsonManagedReference
public List<Car> getCars() {
return cars;
}
我的服务级别:
@POST
@Path("/PersonRegistration")
@Consumes(MediaType.APPLICATION_JSON)
public Response postPersonCars(Person person) throws Exception{
Session session = null;
ObjectMapper mapper = new ObjectMapper();
//Person per = new Person();
//Car cars = new Car();
try{
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
//per.setCars(person.getCars());
session.save(person);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
if(null != session){
session.close();
}
}
return Response.status(201).entity(mapper.writeValueAsString(person)).build();
}
此注释:
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
有两个后果:
mappedBy
意味着Car
是关系的拥有方。这意味着,每当您想要在Car
和Person
之间建立关系时,您需要通过将Car.Person
属性设置为适当的值来实现。对Person.cars的更改将被Hibernate忽略李>
cascade=CascadeType.ALL
意味着无论何时保存Person
,Hibernate都会对Person.cars中包含的所有实体调用保存操作
结果:您正在对一组未正确设置Car.person
属性的Car
实体调用Session.save()
解决方案:要么更改关系的拥有方(请注意,如果您不想创建额外的数据库表,您还需要在Person.cars
上设置@JoinColumn
),要么遍历Person.cars
,并在每个关系中正确设置Car.Person
属性
cascade=CascadeType.ALL
建议第一个解决方案更适合您的用例 谢谢你的回答。我正在调用session.save on person实体,该实体具有汽车的ArrayList。那么我应该迭代json并将cars设置为Person吗?您应该迭代Person.getCars()
并在每个car
上调用car.setPerson(Person)
,所以对于删除也需要这样做吗?迭代person.getCars并删除car,然后删除person?这是一个好方法还是我遗漏了什么?不。在这种情况下,作为CascadeType删除此人就足够了。所有的都将级联删除
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")