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

时间:2019-09-04 05:11:06

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

我正在Spring数据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

    }

ControllerClass

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

从邮递员处调用Rest Api并将json传递为

{

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

以下查询由休眠查询执行也是正确的,而我正在调用休息点的东西 休眠:插入book_category(name)值(?) 休眠:将值(?,?)插入书(book_cat_id,name)

它没有插入book_cat_id,在book_cat_id中它传递了null,因此null被存储了

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

book(ChildTable) book(ChildTable) 我想得到像儿童桌子 I want my table like this

1 个答案:

答案 0 :(得分:3)

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

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

Book实体的方法。

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

编辑:另外,甚至以为我不鼓励这种解决方案是像这样修改savePerson方法

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