我正在尝试实现此解决方案:BookPublisher有一个复合键,所以我构建了可嵌入的类:
@Embeddable
public class BookPublisherID implements Serializable{
private int bookID;
private int publisherID;
//getters and constructor
这是 bookPublisher 类:
@Entity
@Table(name = "book_publisher")
public class BookPublisher implements Serializable{
@EmbeddedId
private BookPublisherID id;
private Date publishedDate;
@MapsId("bookID")
@ManyToOne
@JoinColumn(name = "book_id")
private Book book;
@MapsId("publisherID")
@ManyToOne
@JoinColumn(name = "publisher_id")
private Publisher publisher;
//getters and setters
这是书课:
@Entity
public class Book{
private int id;
private String name;
@OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<BookPublisher> bookPublishers;
//getters and setters
发布者类:
@Entity
public class Publisher{
private int id;
private String name;
@OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<BookPublisher> bookPublishers;
//getters and setters
图书出版商存储库:
public interface BookPublisherRepository extends JpaRepository<BookPublisher, BookPublisherID>{}
这是实现:
@Service
public class BookPublisherImpl implements BookPublisherMetier{
@Autowired
private BookPublisherRepository bookPublisherRepository;
@Override
public BookPublisher savePublication(BookPublisher bookPublisher) {
bookPublisher.setPublishedDate(new Date());
return bookPublisherRepository.save(bookPublisher);
}
}
问题是如何在复合键的情况下在 Json 中添加 bookPublisher(我与邮递员一起工作(。我尝试了下面的解决方案和其他可能性,但我遇到了同样的问题:试图从空的一对一属性分配 ID [com.example.entities.BookPublisher.book]
{
"id": {
"bookID":1,
"publisherID":1
},
"book":{
"id":1
},
"publisher":{
"id":1
}
}
非常感谢。
我在这里看到了几个关键项目。
- 如果你对对象所做的只是基本的getter和setter,你应该只使用默认属性,而不是定义私有字段。 我发现即使不必自己实现可序列化,这也将始终序列化。 此外,请注意私有变量不会序列化,因为它们不可访问。
- 需要使用自定义持有者对象,而不是使用实体对象。 您需要为关系选取一个基本对象和一个方向。 实体对象包括返回到您来自的相关对象的关系,从而创建无法序列化的循环引用。 它只会在他们之间无限地移动。 您需要使用不这样做的对象结构。