Почему метод удаления JpaRepository фактически не удаляет элементы из базы данных? - PullRequest
0 голосов
/ 23 июня 2019

У меня есть два класса:

@Entity
public class Dinner {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long dinnerId;

    @Column(unique = true)
    private String date;

    @OneToMany(mappedBy="dinner", orphanRemoval = true, cascade = CascadeType.PERSIST)
    private List<DinnerTable> tables = new ArrayList<>();

@Entity
public class DinnerTable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long dinnerTableId;
    private int places;

    @ManyToOne
    @JoinColumn(name = "dinner_id")
    @JsonIgnore
    private Dinner dinner;

Если я выполню это, он ничего не удалит, даже если он выполнит метод deleteById для каждого DinnerTable.

@Override
public void test1(String date) {
    Dinner dinner = dinnerService.getByDate(date);

    for(DinnerTable table: dinner.getTables()){
         dinnerTableRepository.deleteById(table.getDinnerTableId());
    }
}

Вместо этого, если я выполняю этот метод, он корректно удаляет объекты DinnerTable из базы данных.

@Override
public void test2(String date) {
    Dinner dinner = dinnerService.getByDate(date);

    dinnerTableRepository.deleteById(1);
    dinnerTableRepository.deleteById(2);
    dinnerTableRepository.deleteById(3);
}

Эти методы находятся внутри этого класса обслуживания

@Service
@Transactional
public class DinnerServiceImpl implements DinnerService {...}

И DinnerTableRepository - это класс:

@Repository
public interface DinnerTableRepository extends JpaRepository<DinnerTable, Long> {
}

EDIT

Это тоже не работает:

List<DinnerTable> tables = dinner.getTables();
for(int i = 1; i < 3; i++){           
    dinnerTableRepository.deleteById(tables.get(i).getDinnerTableId());
}

Это отлично работает, фактически удаляет объекты DinnerTable из базы данных:

long id = 40;  //id of the first DinnerTable to remove
for(int i = 1; i < 3; i++){
    dinnerTableRepository.deleteById(id + i);
}

РЕДАКТИРОВАТЬ 2

Это работает:

List<Long> ids = new ArrayList<>(Arrays.asList(43L, 44L, 45L));
for(Long id: ids){
    dinnerTableRepository.deleteById(id);
}

РЕДАКТИРОВАТЬ 3

Таким образом, это работает:

for(int i = 0; i < dinner.getTables().size(); i++){
    dinner.removeTable(dinner.getTables().get(i));
}
dinnerRepository.save(dinner);

1 Ответ

0 голосов
/ 24 июня 2019

У вас есть проблемы в @OneToMany и @ManyToOne.

Кроме того, я использую Project Lombok аннотации

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table

Насколько я понимаю, Dinner-класс является основным объектом, а DinnerTable-класс является зависимым.

В этом примере я буду использовать @OneToMany/@ManyToOne двунаправленный .

читать о каскаде

Попробуйте этот код:

Diner.java:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table
public class Dinner {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "dinner_generator")
    @SequenceGenerator(name="dinner_generator", sequenceName = "dinner_seq", allocationSize = 1, initialValue = 1)
    private long dinnerId;

    @Column(unique = true)
    private String date;

    @OneToMany(
            mappedBy = "professor",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    private List<DinnerTable> tables = new ArrayList<>();

    /* 
    Use methods below to add or remove tables!!!!!!
    */

    public void addDinnertable(DinnerTable dinnerTable) {
        tables.add(dinnerTable);
        dinnerTable.setDinner(this);
    }

    public void removeDinnertable(DinnerTable dinnerTable) {
        tables.remove(dinnerTable);
        dinnerTable.setDinner(null);
    }

DinnerTable.java:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table
public class DinnerTable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "dintable_generator")
    @SequenceGenerator(name="dintable_generator", sequenceName = "dintable_seq", allocationSize = 1, initialValue = 1)
    private Long id;

    private long dinnerTableId;

    private int places;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dinner_id")
    private Dinner dinner;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...