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

标签 java hibernate rest jakarta-ee http-post

我在人员类别和汽车类别之间建立了一对多关系。一个人可以拥有多辆汽车,反之亦然。我正在使用 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")

有两个后果:

  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.cars并设置 Car.person他们每个人都拥有适当的属性(property)。

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

关于java - Hibernate保存对象(一对多关系)外键为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41368301/

相关文章:

java - Spring MVC : How to populate my Object with JSON

java - 可以存储多种数据类型的变量

hibernate - 在Hibernate中快速添加表和列?

java - JPA/Hibernate 查询返回过时的结果

java - 处理过时的域对象(Grails/GORM/Hibernate)引起的并发问题的策略

java - 如何操作 GET 响应中的信息

java - 如何使用 Spring 扫描注释以及分配给它们的值

java - 如何在Java GUI中释放文件而不关闭

java - 不确定Java中变量的默认初始化

java - 在java中取消链接复制的实例变量