小编典典

休眠保存对象(一对多关系)外键为空

hibernate

我在个人课程和汽车课程之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用Restful
API发布数据。我的注释和Get服务运行正常,但是我的后服务java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL" error在每次尝试插入新数据时都抛出“ 。子表foreign key插入为”
null

这是我的代码的一部分。

人.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();
        }

阅读 283

收藏
2020-06-20

共1个答案

小编典典

此注释:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")

有两个后果:

  1. mappedBy暗示这Car是关系的拥有方。这意味着,每当要在Car和之间建立关系时Person都需要通过将Car.person属性设置为适当的值来实现。对的更改Person.cars将被Hibernate忽略。
  2. cascade=CascadeType.ALL意味着每当您保存一个时Person,Hibernate还将在其中包含的所有实体上调用保存操作Person.cars

结果:您正在调用Session.save()一堆Car没有Car.person正确设置属性的实体。

解决方案:要么更改关系的所有权(请注意,如果您不想创建额外的数据库表,则还需要@JoinColumn打开Person.cars),或者循环遍历Person.carsCar.person在每个属性中正确设置属性。

cascade=CascadeType.ALL 建议第一个解决方案更适合您的用例。

2020-06-20