簡體   English   中英

Spring + Hibernate:在 OneToMany 關系中創建映射到虛構父級的子級

[英]Spring + Hibernate: creating child mapped to fictional parent in OneToMany relationship

我有這兩個實體:

@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Getter
@Entity
@Table(name = "BOOKS")
public class Book {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private long id;

    @NotNull
    @Column(name = "TITLE")
    private String title;

    @NotNull
    @Column(name = "AUTHOR")
    private String author;

    @NotNull
    @Column(name = "PUBLICATION_YEAR")
    private int publicationYear;

    @JsonBackReference
    @EqualsAndHashCode.Exclude
    @OneToMany(
            targetEntity = BookCopy.class,
            mappedBy = "book",
            cascade = CascadeType.ALL,
//            orphanRemoval = true,
            fetch = FetchType.LAZY
    )
    private List<BookCopy> bookCopies = new ArrayList<>();

    public Book(String title, String author, int publicationYear) {
        this.title = title;
        this.author = author;
        this.publicationYear = LocalDate.of(publicationYear, 1, 1).getYear();
    }
}
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Getter
@Setter
@Entity
@Table(name = "BOOK_COPIES")
public class BookCopy {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private long id;

    @JsonManagedReference
    @NotNull
    @EqualsAndHashCode.Exclude
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TITLE_ID")
    private Book book;

    @Enumerated(EnumType.STRING)
    @Column(name = "RENT_STATUS")
    private RentStatus rentStatus;

    public BookCopy(Book book, RentStatus rentStatus) {
        this.book = book;
        this.rentStatus = rentStatus;
    }

    public void setBook(Book book) {
        this.book = book;
        book.getBookCopies().add(this);
    }
}

Now, through Hibernate I create and save a new BookCopy item, by sending through to my Spring Web system a JSON like this one:

{
    "book":{
        "id": 99999
    },
    "rentStatus": "HIRED"
}

問題是,該 id 的書在 Book 表中不存在。 有沒有辦法,我可以讓這個 BookCopy 保存操作首先驗證其父關系的存在?

更新:添加負責保存在數據庫中的類:

一、DBService class:

@Repository
public class BookCopyDbService {
    @Autowired
    private BookCopyRepository bookCopyRepository;

    public BookCopy saveBookCopy(BookCopy bookCopy) {
        return bookCopyRepository.save(bookCopy);
    }
}

和 CrudRepository class,與數據庫接口:

@Transactional
@Repository
public interface BookCopyRepository extends CrudRepository<BookCopy, Long> {
}

可能,我可以在 BookCopyDbService 的 saveBookCopy() 中添加一些邏輯,它首先會嘗試在 Book 表中按 ID 查找該書,並且僅當在該搜索中找到一本書時才保存 BookCopy,但我想知道 Hibernate 是否真的有一些為我做到這一點的機制到位。

您需要先通過 id 獲取 Book 實體,然后嘗試設置 BookCopy。 如果 book 不存在,那么你可以拋出異常。

@Service
public class BookService {
    @Autowired
    private BookRepository bookRepository;

    @Transactional
    public BookCopy saveBookCopy(BookCopy bookCopy,Long bookId) {
      Book book =bookRepository.findById(bookId).orElseThrow(()-> new 
       BookNotFoundException("Book not found."));
      book.getBookCopies().add(bookCopy);

        return book.getBookCopy();
    }

}

@Transactional 將負責將 BookCopy 插入表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM