Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠保存对象(一对多关系)外键为空_Java_Hibernate_Rest_Jakarta Ee_Http Post - Fatal编程技术网

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

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>

我在个人等级和汽车等级之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用RESTfulAPI发布数据。我的annotations和Get服务工作正常,但每当我尝试插入新数据时,我的post服务就会抛出“
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")