Jpa репозиторий не удаляется из БД - PullRequest
0 голосов
/ 18 декабря 2018

Итак, у меня есть эта сущность

@Entity
@Table(name = "VISITOR_IMAGE")
public class VisitorImage implements Serializable {

    @Id
    @Column(name = "VISITOR_ID")
    private Long visitorId;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @PrimaryKeyJoinColumn(name = "VISITOR_ID", referencedColumnName = "ID")
    private Visitor visitor;

    @Column(name = "NAME")
    private String name;

    @Column(name = "DATA")
    private byte[] data;

    @Column(name = "CONTENT_TYPE")
    private String contentType;

    @Column(name = "SIZE")
    private Long size;

    //getters and setters

}

, и здесь у меня есть репозиторий jpa:

@Repository
public interface VisitorImageRepository extends JpaRepository<VisitorImage, Long> {}

, поэтому, когда я вызываю delete в сервисе, нет ошибки или чего-то еще, ноон не удален

@Override
    public void deleteByVisitorId(Long visitorId) {
        visitorImageRepository.delete(visitorId);
}

Я не могу понять, почему он не удален ... первичный ключ для таблицы - "VISITOR_ID"

Я бы добавил, что сохранение работает нормально.

Любая помощь?

Ответы [ 4 ]

0 голосов
/ 18 декабря 2018

[решено] проблема была на объекте Visitor, у которого было

@OneToOne(mappedBy = "visitor", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, orphanRemoval = true)
    private VisitorImage visitorImage;

Я изменил CascadeType на REMOVE и теперь он работает.

0 голосов
/ 18 декабря 2018

Вы сопоставили vistor как один-к-одному, а параметр каскада как постоянный, т.е. "cascade = CascadeType.PERSIST" Он не позволяет вам удалить.Для удаления необходимо установить для параметра каскадирования значение Cascade.All или Cascade.Remove

.
0 голосов
/ 18 декабря 2018

Вы можете попробовать альтернативный метод deleteById, как показано ниже

public void deleteUserById(long id) {
        visitorRepository.deleteById(id);
}
0 голосов
/ 18 декабря 2018

Автоматически подключите ваш репозиторий к классу, где вы написали этот метод удаления.например,

@Autowired 
private VisitorImageRepository visitorRepository;

, затем вызовите метод удаления.

visitorRepository.delete(visitorId);

сосредоточьте внимание на каскадном типе .Из-за каскадирования он не сможет удалить запись родительской таблицы, пока дочерний элемент не будет удален.

, поэтому попробуйте прокомментировать тип каскада.

...