簡體   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