如何解决如何使用Hibernate将数据添加到具有额外列的多对多关联中
我有一个要连接的 User
表和一个 Book
表。
因此,我创建了第三个表 Borrow
,该表具有外键( book_id,user_id
)以及takenDate
和broughtDate
字段。
User.java
@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String surname;
private String username;
private String email;
private String password;
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL,orphanRemoval = true)
private List<Borrow> borrow;
....
Book.java
@Entity
@Table(name = "Books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String title;
private String ISBN;
private String author;
private String issuer;
private Integer dateOfIssue;
private Boolean IsRented;
@OneToMany(mappedBy = "book",orphanRemoval = true)
private List<Borrow> borrow;
.....
Borrow.java
@Entity
@Table(name = "Borrows")
@IdClass(BorrowId.class)
public class Borrow {
private Date takenDate;
private Date broughtDate;
//lazy means it will get details of book
// only if we call GET method
@Id
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_id",referencedColumnName = "id")
private Book book;
@Id
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_id",referencedColumnName = "id")
private User user;
....
BorowId.java
public class BorrowId implements Serializable {
private int book;
private int user;
// getters/setters and most importantly equals() and hashCode()
public int getBook() {
return book;
}
public void setBook(int book) {
this.book = book;
}
public int getUser() {
return user;
}
public void setUser(int user) {
this.user = user;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BorrowId)) return false;
BorrowId borrowId = (BorrowId) o;
return getBook() == borrowId.getBook() &&
getUser() == borrowId.getUser();
}
@Override
public int hashCode() {
return Objects.hash(getBook(),getUser());
}
}
我的MySql数据库设计如下:
我正在尝试将数据添加到Borrow
表中,如下所示:
已编辑
@Transactional
@PostMapping("/addUser/{id}/borrow")
public ResponseEntity<Object> createItem(@PathVariable int id,@RequestBody Borrow borrow,@RequestBody Book book){
Optional<User> userOptional = userRepository.findById(id);
Optional<Book> bookOptional = bookRepository.findById(book.getId());
if(!userOptional.isPresent()){
throw new UserNotFoundException("id-" + id);
}
User user = userOptional.get();
borrow.setUser(user);
borrow.setBook(book);
borrowRepository.save(borrow);
URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(borrow.getId()).toUri();
return ResponseEntity.created(location).build();
}
我还没有完成,因为我不确定如何:/ 任何提示,不胜感激!
解决方法
您快到了。您只需要记住两件事:
1)您还必须通过存储库获取Book
(当前仅获取User
)
2)这三个操作都必须在同一事务上下文内:
fetching of `User`,fetching of `Book` and save `Borrow` entity.
提示:您可以将所有这些内容放入服务中并将其标记为@Transactional
或将@Post
方法标记为@Transactional
。我建议第一种选择,但这取决于您。
编辑:
Optional<Book> bookOptional = bookRepository.findById(book.getId());
此外,这里使用@EmbeddedId
代替@IdClass
似乎是足够的,因为id是实际的外来实体:
@Embeddable
public class BorrowId{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_id",referencedColumnName = "id")
private Book book;
@ManyToOne
@JoinColumn(name = "user_id",referencedColumnName = "id")
private User user;
}
,然后在“借阅”类中:
@Entity class Borrow{
@EmbeddedId BorrwId borrowId;
...
}
并在Post方法中:
BorrowId borrowId = new BorrowId();
borrowId.setUser(user);
borrowId.setBook(book);
borrow.setBorrowId(borrowId);
borrowRepository.save(borrow);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。