持久保留子表JPA的问题

我在MySQl中具有OneToMany关系,并使用JPA对其进行了映射。从数据库中检索信息时,它工作得很好,但是在持久化子表时出现了问题。 Picture of ERD

-MySQL Workbench正向工程

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARactER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`course`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`course` (
  `id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(45) NULL,`descr` VARCHAR(45) NULL,PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`topic`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`topic` (
  `id` INT NOT NULL AUTO_INCREMENT,`course_id` INT NOT NULL,PRIMARY KEY (`id`,`course_id`),INDEX `fk_topic_course_idx` (`course_id` ASC) VISIBLE,CONSTRAINT `fk_topic_course`
    FOREIGN KEY (`course_id`)
    REFERENCES `mydb`.`course` (`id`)
    ON DELETE NO actION
    ON UPDATE NO actION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

@Entity
@Table(name = "course",schema = "mydb")
public class Course implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1886462862094528507L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "descr")
    private String descr;

    @OneToMany(mappedBy = "course",fetch = FetchType.EAGER) //name of object in Topic entity  
    @JsonmanagedReference
        private Set<Topic> topic; 
}


@Entity
@Table(name="topic",schema = "mydb")
public class Topic implements Serializable {


    /**
     *
     */
    private static final long serialVersionUID = -365302645107748753L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id",updatable = false)
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "descr")
    private String descr;


    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="course_id") //name of the foreign key. Must pay attention here 
    @JsonBackReference
    private Course course;
}

我试图通过使用以下JSON发出发布请求来保留子表。 'course_id'是foreign key,但出现错误。

{
    "id": 1,"name: "Java","descr": "This topic goes over Java core","course_id": 1
 }
  

2019-11-14 13:11:27.013错误18916-[nio-8081-exec-2] oaccC [。[。[/]。[dispatcherServlet]:Servlet [dispatcherServlet]的Servlet.service()在路径为[]的上下文中引发异常[请求处理失败;嵌套的异常是org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [n / a];约束[null];嵌套的异常是org.hibernate.exception.ConstraintViolationException:无法执行具有根本原因的语句]

     

java.sql.SQLIntegrityConstraintViolationException:列“ course_id”不能为空

orez99 回答:持久保留子表JPA的问题

发生错误是因为您使用的是@GeneratedValue,而没有其他说明。默认情况下,休眠将尝试到达名为<schema-name>.hibernate-sequence的序列。

由于您使用的是mysql,因此可以进行注释:

@GeneratedValue(strategy = GenerationType.IDENTITY)

这将导致使用mysql的AUTO_INCREMENT而不是序列进行休眠。

在架构创建时,您还需要使用AUTO_INCREMENT定义列。

在持久化之前,您还缺少对Course实体的参照;

topic.setCourse(entityManager.getReference(Course.class,courseId));

courseIdcourse_id作为json传递。

本文链接:https://www.f2er.com/3100743.html

大家都在问