off*_*ron 5 java rest hibernate http-post java-ee
我在班级和汽车班之间有一对多的关系.一个人可以拥有许多汽车,反之亦然.我正在使用restful API发布数据.我的注释和获取服务工作正常但我的帖子服务抛出"java.sql.SQLIntegrityConstraintViolationException:ORA-01400:无法插入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;
}
Run Code Online (Sandbox Code Playgroud)
Car.java
private Person person;
@ManyToOne
@JoinColumn(name = "PERSON_ID", nullable = false, updatable = true, insertable = true)
@JsonBackReference
public Person getPerson() {
return person;
}
Run Code Online (Sandbox Code Playgroud)
我的服务类:
@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();
}
Run Code Online (Sandbox Code Playgroud)
cri*_*zis 11
这个注释:
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
Run Code Online (Sandbox Code Playgroud)
有两个后果:
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
在每个属性中正确设置属性.
cascade=CascadeType.ALL
建议第一个解决方案更适合您的用例.
归档时间: |
|
查看次数: |
6294 次 |
最近记录: |