Spring boot entity, отношения и путаница в хранилище - PullRequest
0 голосов
/ 04 октября 2018

Я не понимаю, как работают отношения в сущностях и что это значит для моего репозитория 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 аннотация.Почему альбом должен ссылаться на ссуду?

Я в основном привык к отношениям с базами данных, поэтому, возможно, я думаю о вещах неправильно.Если я могу только добавить новые альбомы к кредиту, то это побеждает цель того, что я пытаюсь сделать.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Я обновил свой источник, как вы описали, и произвел некоторые изменения при запуске.

Если я сначала создаю ссуду, а затем сохраняю ее в хранилище ссуд и затем добавляю набор альбомов, он недольше происходит сбой.

    Loan loan = new Loan(1, new Date(), calendar.getTime(),null);

    loanRepository.save(loan);

    List<Album> albumList = AlbumImport.getAlbumList();
    albumRepository.save(albumList);


    List<Album> albums = new ArrayList<>();
    albums.add(albumList.get(1));
    albums.add(albumList.get(5));

    loan.setAlbums(albums);

Однако, когда я запускаю свой тест getLoan, список альбомов становится пустым

0 голосов
/ 04 октября 2018

Удаление каскада = CascadeType.ALL исправил мою проблему.

0 голосов
/ 04 октября 2018
    Loan and Album tables have a one-to-many relationship.
    So in Album your mapping should be like below:
    @ManyToOne
    @JoinColumn(name = "loan_id")
    private Loan loan;
Considering loan_id is the primary key of Loan.
And in Loan your mapping should be like below:
@OneToMany(mappedBy = "loan", cascade = CascadeType.ALL)
    private List<Album> albums;

@OneToMany and @ManyToOne defines a one-to-many and many-to-one relationship between 2 entities. @JoinColumn indicates the entity is the owner of the relationship: the corresponding table has a column with a foreign key to the referenced table. mappedBy indicates the entity is the inverse of the relationship
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...