我在人员类别和汽车类别之间建立了一对多关系。一个人可以拥有多辆汽车,反之亦然。我正在使用 Restful API 来发布数据。我的注释和 Get 服务工作正常,但每当我尝试插入新数据时,我的后期服务都会抛出“java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot 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;
}
汽车.java
private Person person;
@ManyToOne
@JoinColumn(name = "PERSON_ID", nullable = false, updatable = true, insertable = true)
@JsonBackReference
public Person getPerson() {
return person;
}
我的服务类:
@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
中包含的所有实体调用保存操作
结果:您正在调用 Session.save()
在一堆 Car
没有 Car.person
的实体属性设置正确。
解决方案:要么更改关系的拥有方(请注意,如果您不想创建额外的数据库表,您还需要在 @JoinColumn
上设置一个 Person.cars
)或遍历 Person.cars
并设置 Car.person
他们每个人都拥有适当的属性(property)。
cascade=CascadeType.ALL
建议第一个解决方案更适合您的用例。
关于java - Hibernate保存对象(一对多关系)外键为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41368301/