java - 父实体的主键未存储为子实体中的外键

标签 java spring spring-boot spring-data-jpa

我在 spring data Jpa 中使用 OneToMany 关系并使用 postMan 测试 api

@Entity
@Table(name = "book_category")
public class BookCategory {
ParentEntity
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "bookCat_id")
    private Long id;

    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy="bookCategory")
    private Set<Book> books;

    public BookCategory(String name, Set<Book> books) {
        this.name = name;
        this.books = books;
    }

// getter and setter

}

ChildEntity


    @Entity
    @Table(name = "book")
    public class Book {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "book_id")
        private Long bookId;

        private String name;

        @ManyToOne(cascade = CascadeType.PERSIST)
        @JoinColumn(name = "bookCat_id")
        BookCategory bookCategory;

        public Book() {

        }

    //getter  and Setter

    }

Controller 类

@RestController
@RequestMapping(value = "/bookCategory")
public class BookController {

    @Autowired
    BookCategoryRepository bookCategoryRepository;

    @Autowired
    BookRepository bookRepository;

    @PostMapping("/addBookCategory")
    public BookCategory savePerson(@Valid @RequestBody BookCategory bookCategory){
        return bookCategoryRepository.save(bookCategory);
    }
}

从 postman 调用 Rest Api 并传递 json 为

{

    "name":"Category 1",
    "books":[
          {"name" : "Hello Koding 1"},
          {"name":"Hello Koding 2"}
        ]
} 

以下查询由 hibernate 查询执行也是正确的,而我正在调用休息点 Hibernate:插入 book_category(名称)值(?) Hibernate:插入书(book_cat_id,名称)值(?,?)

它没有插入 book_cat_id,它在 book_cat_id 中传递 null,所以 null 正在存储

数据存储在数据库中 book_category Parent Table in database

书(子表) book(ChildTable) 我想得到 Child Table Like I want my table like this

最佳答案

问题是您没有在子对象中设置父对象。在代码的某处你应该调用

public void setBookCategory(BookCategory bookCategory) { ... }

Book 实体的方法。

我建议通过在 Controller 中使用 DTO 并将它们映射到服务层中的实体来解决此问题,因为使用持久实体作为 http 请求的参数会导致严重的安全漏洞,如 here 所述.

编辑:或者,即使我认为我不会鼓励这种解决方案,也可以像这样修改 savePerson 方法

@PostMapping("/addBookCategory")
public BookCategory savePerson(@Valid @RequestBody BookCategory bookCategory){
    bookCategory.getBooks().forEach(book -> book.setBookCategory(bookCategory));
    return bookCategoryRepository.save(bookCategory);
}

关于java - 父实体的主键未存储为子实体中的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57781841/

相关文章:

java - 在 Junit5 中为每个测试设置环境变量

java - 注释使用不当应使用什么异常

java - 从静态最终变量初始值设定项获取 Logger 是否有效?

spring - 如何在 Spring Boot 中禁用 http 服务器?

java - @ComponentScan 无法使用 spring-boot-starter-test 进行测试

java - 将 Spring Boot 升级到 2.7.0- 无法启动 bean 'documentationPluginsBootstrapper

java - JAXB 编码/解码 NullpointerException 困境

spring boot jar NoSuchBeanDefinitionException

java - Spring 能够处理这个用户案例吗?既不是属性注入(inject)也不是构造函数注入(inject)

java - spring.profiles.active 在 spring boot 应用程序中不起作用