Я не понимаю, как работают отношения в сущностях и что это значит для моего репозитория JPA.
У меня есть класс Loan, в котором хранится список альбомов для каждого займа.
У меня есть хранилище займов и хранилище альбомов.Репозиторий альбомов заполняется альбомами, когда я запускаю приложение.Идентификатор альбома генерируется автоматически.
Когда я создаю новый кредит и пытаюсь добавить альбом из репозитория, я получаю исключение:
Причина: org.springframework.dao.InvalidDataAccessApiUsageException: detached entityпередано для сохранения: com.library.demo.entity.Album;Вложенное исключение - org.hibernate.PersistentObjectException: отдельная сущность передана в постоянное хранилище: com.library.demo.entity.Album
Если я создаю новый кредит и добавляю новый альбом на лету, тогда он работает, как и ожидалось.Во время отладки я понял, что это потому, что идентификатор альбома равен нулю при добавлении нового альбома на лету в ссуду, предположительно потому, что он добавляет альбом в хранилище и генерирует новый идентификатор альбома при создании ссуды.
Моя сущность альбома выглядит так:
@Entity
public class Album implements Serializable {
private static final long serialVersionUID = 0x63A6DA99AA12AAA8L;
@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer albumId;
@Column (unique=true) private String barcode;
@Column private String band;
@Column private String title;
@Column private String genre;
@Column private Integer year;
@Column private String artworkFilename;
@Column private Boolean enabled;
@Column private Boolean isLoanable;
@Column private Integer numberOfCopies;
@ManyToOne
private Loan loan;
А мой кредит выглядит так:
public class Loan implements Serializable {
private static final long serialVersionUID = 0x62B6DA99AA12AAA8L;
public void setLoanId(Integer loanId) {
this.loanId = loanId;
}
@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer loanId;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Album> albums= new ArrayList<>();
@Column private Integer customerId;
@Column private Date dateLoaned;
@Column private Date dateToReturn;
@Column private Boolean expired;
Я также не понимаю, почему альбом должен ссылаться на кредит сManyToOne аннотация.Почему альбом должен ссылаться на ссуду?
Я в основном привык к отношениям с базами данных, поэтому, возможно, я думаю о вещах неправильно.Если я могу только добавить новые альбомы к кредиту, то это побеждает цель того, что я пытаюсь сделать.