![](/img/trans.png)
[英]Parent id not insert to child table whit OneToMany relationship in java hibernate
[英]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.