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

时间:2016-12-28 19:11:13

标签: java hibernate rest java-ee http-post

我在班级和汽车班之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用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;
 }

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

1 个答案:

答案 0 :(得分:9)

此注释:

def total(stock):
    return sum([v*prices[k] for k,v in stock.iteritems()]) #.iteritems() is a built in method for dicts. it returns key, value pairs
                                                           #same as i, dict[i]

有两个后果:

  1. @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person") 暗示mappedBy是关系的拥有方。这意味着,只要您想在CarCar之间建立关系,就需要将Person属性设置为适当的值。 Hibernate将忽略对Car.person的更改。
  2. Person.cars表示无论何时保存cascade=CascadeType.ALL,Hibernate都会调用Person
  3. 中包含的所有实体的保存操作

    结果:您正在对未正确设置Person.cars属性的一组Session.save()实体调用Car

    解决方案:要么改变关系的拥有方(要知道如果不想创建额外的数据库表,还需要Car.person @JoinColumn)或循环{ {1}}并在每个属性中正确设置Person.cars属性。

    Person.cars表明第一种解决方案更适合您的用例。