[英]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.