当前位置: 首页 > 知识库问答 >
问题:

插入子记录时Hibernate映射错误

仰翰采
2023-03-14

我有两个实体类,如下所示-

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;

我在保存子记录时出错。

错误-

Hibernate:插入子(名称,child\u id)值(?,)2022-07-19 23:12:31.727警告20940---[nio-8080-exec-2]o.h.engine.jdbc.spi。SqlExceptionHelper:SQL错误:0,SQLState:23502 2022-07-19 23:12:31.727错误20940---[nio-8080-exec-2]o.h.engine.jdbc.spi。SqlExceptionHelper:错误:“parent\u id”列中的null值违反了非null约束详细信息:失败的行包含(1,s1,null)。2022-07-19 23:12:31.728信息20940---[nio-8080-exec-2]o.h.e.j.b.内部。AbstractBatchImpl:hh000010:batch发布时,它仍然包含JDBC语句2022-07-19 23:12:31.754错误20940-[nio-8080-exec-2]o.a.c.c.c.[/]。[dispatcherServlet]:Servlet。路径为[]的上下文中servlet[dispatcherServlet]的service()引发异常[Request processing failed;嵌套异常为org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[parent_id];嵌套异常为org.hibernate.exception。ConstraintViolationException:无法执行具有根本原因的语句]

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

不确定hibernate将如何拾取外键并将其分配给子级。

共有1个答案

宇文和昶
2023-03-14

你得先设置双向关系

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);
     }
}

并通过该方法添加孩子。

 类似资料:
  • 我在Parent中提供了一个简单的oneToMany关系,并在Chile Entity类中提供了相应的ManyToOne: 起源: } 儿童班级: 操作类: 示例案例:Status_code Reason_text abc abc1 xyz xyz1 保存表单:Status_code Reason_text abc abc1 xyz xyz1 abc abc1 xy z xyz2 对于任何操作:N

  • 我有两个表,asdf和qwer,两个表都有一个名为“id”的主键。当我连接这两个表时,结果将有两个名为id的列,而JOOQ无法将记录正确映射到pojo。 现在,每个Asdf实例都与元组中对应的Qwer实例具有相同的id。 有没有聪明的别名技巧可以解决这个问题,或者我在JOOQ文档中遗漏了什么,或者这是JOOQ中的一个bug?

  • 我有一个父表和子表。父记录已由其他进程插入。我需要添加引用父记录的子记录,例如: 插入CHILD记录时,引用父记录的唯一信息是地址。我需要从父表中获取PARENT_ID,使用子的ADDRESS来设置子的FK。 在hibernate中有没有一种方法可以做到这一点,这样我就不需要通过地址查询父项来将其与子记录一起插入?或者,我是否继续沿着这条路径,按地址查询父对象,然后将父对象传递给子对象?

  • 我有一个奇怪的错误:我有一个使用Hibernate的注释类。一切都很好,直到我开始这样介绍日志: 产生的错误是: [错误]原因:org。冬眠MappingException:无法确定组织的类型。slf4j。Logger,位于table:container,用于列:[org.hibernate.mapping.Column(Logger)] 根据我的理解,在这种情况下,静态场应该是合适的。那么为什么

  • 我正在尝试使用Hibernate 4.3和SQL Server 2014,仅对尚未存储的实体执行批量插入到表中。我创建了一个简单的表,其中定义了一个主键来忽略重复的键 尝试通过Stateless会话插入方法执行批处理插入,如果一个或多个实体已经存储到数据库表中,则批处理插入可能会失败:Hibernate抛出StaleStateException: 当批处理语句完成时,Hibernate会检查返回的

  • 问题内容: 我有5个MySQL InnoDB表:每个表都在Hibernate中映射并起作用。我玩过使用StatelessSession / Session和JDBC批处理大小。我删除了任何生成器类,以使MySQL处理id生成- 但它的执行速度仍然很慢。这些表中的每一个都在java类中表示,并相应地在hibernate中进行映射。目前,当需要将数据写出时,我遍历对象并执行一个(如果正在使用State