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