繁体   English   中英

插入子记录时出现休眠映射错误

[英]Hibernate mapping error while inserting child record

我有两个实体类如下 -

public class Parent {

    @Id
    private Integer parentId;
    private String name;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> children;
}
public class Child {

    @Id
    private Integer childId;
    private String name;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parentId", insertable = false, updatable = true, nullable = false)
    private Parent parent;
}

@RestController
public class ParentController {

    @Autowired
    private ParentRepo repo;

    @GetMapping("/parent")
    public void get() {
        Child c1 = Child.builder().childId(1).name("s1").build();
        Child c2 = Child.builder().childId(2).name("s2").build();
        List<Child> children = new ArrayList<>();
        children.add(c1);
        children.add(c2);
        Parent parent = Parent.builder().parentId(1).name("PARENT")
                .children(children)
                .build();
        Parent savedParent = repo.save(parent);
}
}
Tables -

CREATE TABLE public.parent
(
    parent_id integer NOT NULL,
    name character varying(255) COLLATE pg_catalog."default",
    CONSTRAINT parent_pkey PRIMARY KEY (parent_id)
)WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

CREATE TABLE public.child
(
    child_id integer NOT NULL,
    name character varying(255) COLLATE pg_catalog."default",
    parent_id integer NOT NULL,
    CONSTRAINT child_pkey PRIMARY KEY (child_id),
    CONSTRAINT fk7dag1cncltpyhoc2mbwka356h FOREIGN KEY (parent_id)
        REFERENCES public.parent (parent_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

保留子记录时出现错误。

错误 -

休眠:插入子(名称,child_id)值(?,?)2022-07-19 23:12:31.727 WARN 20940 --- [nio-8080-exec-2] ohengine.jdbc.spi.SqlExceptionHelper:SQL错误:0,SQLState:23502 2022-07-19 23:12:31.727 错误 20940 --- [nio-8080-exec-2] ohengine.jdbc.spi.SqlExceptionHelper:错误:“parent_id”列中的空值违反了 not-空约束详细信息:失败行包含 (1, s1, null)。 2022-07-19 23:12:31.728 INFO 20940 --- [nio-8080-exec-2] ohejbinternal.AbstractBatchImpl:HHH000010:在批处理发布时它仍然包含 JDBC 语句 2022-07-19 23:12:31.754 错误20940 --- [nio-8080-exec-2] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败; 嵌套异常是 org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [不适用]; 约束 [parent_id]; 嵌套异常是 org.hibernate.exception.ConstraintViolationException: could not execute statement] 根本原因

org.postgresql.util.PSQLException:错误:“parent_id”列中的空值违反非空约束详细信息:失败行包含(1,s1,null)。

不确定休眠将如何选择外键并将其分配给孩子。

您必须先设置双向关系

public class Parent {

     @Id
     private Integer parentId;
     private String name;

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = CascadeType.ALL)
     private List<Child> children;

     public void addChild(Child child) {
           this.children.add(child);
           child.setParent(this);
     }
}

并通过该方法添加孩子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM