CrudRepository не удаляет строку

Я создал такой класс плана

Строить планы:

@Entity(name = "Plan")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class PlanEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int planId;

    private String planName;

    private BigDecimal pBenefitMax;

    private LocalDate pStartDate;

    private LocalDate pEndDate;

    private int pCompanyId;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "dPlanId")
    private List<DentalAgreementEntity> dentalAgreementEntities;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "pPlanId")
    private List<PatientEntity> patientEntities;
}

Сущность пациента выглядит следующим образом:

@Entity(name = "Patient")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class PatientEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int patientId;

    private String firstName;

    private String lastName;

    private String patientEmail;

    private String patientPhone;

    private LocalDateTime dateOfBirth;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "tPatientId")
    private List<TransactionEntity> transactionEntities;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "aPatientId")
    private List<AppointmentEntity> appointmentEntities;

    @ManyToOne
    @JoinColumn(name = "pPlanId")
    private PlanEntity planEntity;

}

И сущность соглашения выглядит так:

@Entity(name = "DentalAgreement")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class DentalAgreementEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer agreementId;

    private BigDecimal percentage;

    private Integer dPlanId;

    private String dAdaCode;
}

PlanRepository выглядит следующим образом:

@Repository
public interface PlanRepository extends CrudRepository<PlanEntity, Integer> {
}

И я могу легко успешно сохранять объекты плана. Однако, если я попытаюсь удалить PlanEntity, вот так:

public void deleteCompanyPlan(PlanEntity planEntity){
    planRepository.delete(planEntity);
}

Хотя ошибок не возникает, когда я проверяю базу данных, строка не удаляется. Я попытался сделать класс сериализуемым, просто используя метод «deleteById()» и многое другое, но я не могу удалить план через реализацию Spring. Что я делаю неправильно?

Действительно ли он выполняет какой-либо SQL? Если вы еще этого не сделали, попробуйте установить свойство spring.jpa.show-sql=true, чтобы узнать, выводит ли оно что-нибудь при удалении?

BretC 15.05.2019 15:05

Это долгий путь, но вы пытались изменить тип идентификатора с int на Integer? Из Документация по спящему режиму: мы рекомендуем объявлять атрибуты идентификатора с согласованными именами в постоянных классах и использовать тип, допускающий значение NULL (т. е. не примитивный).

Gustavo Passini 15.05.2019 15:12

На самом деле он не выполняет никакого SQL. Я также попытался изменить PK на Integer, и это тоже не помогло.

user2743227 15.05.2019 15:35

Вам нужно добавить аннотацию @Service/@Component из класса, который вы вызываете deleteCompanyPlan(), и/или самого класса, который определяет deleteCompanyPlan()

Milan Desai 15.05.2019 15:37

Вы не можете изменить данные без транзакции... Судя по вашему методу, там нет @Transactional (или компонента). Следовательно, ничего не будет удалено.

M. Deinum 15.05.2019 15:41
planRepository.deleteById(3);опечатка? planRepository.deleteById(planEntity.getPlanId());
Dirk Deyne 15.05.2019 15:49

Вам не нужен @Transactional в ваших методах репозитория. Также нет необходимости в аннотации @Service/@Component. Я бы рекомендовал установить журналы гибернации на уровень TRACE (в Spring «logging.level.org.hibernate: trace») и проверить журналы, в которых должно произойти удаление. Я предполагаю, что вам нужно установить CASCADE.DELETE в аннотации @ManyToOne.

ndueck 15.05.2019 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема устранена путем удаления FetchType.LAZY и CascadeType.All из родительского объекта.

@Entity(name = "Company")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper=false)
public class CompanyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int companyId;

    private String companyName;

    private String companyNumber;

    private String companyEmail;

    private String companyAddress;

    private String companyCity;

    private String companyState;

    private String companyZip;

    @OneToMany
    @JoinColumn(name = "pCompanyId")
    private List<PatientEntity> patientEntities;

    @OneToMany
    @JoinColumn(name = "pCompanyId")
    private List<PlanEntity> planEntities;

    @Override
    public String toString() {
        return "CompanyEntity{" +
                "companyId = " + companyId +
                ", companyName='" + companyName + '\'' +
                ", companyNumber='" + companyNumber + '\'' +
                ", companyEmail='" + companyEmail + '\'' +
                ", companyAddress='" + companyAddress + '\'' +
                ", companyCity='" + companyCity + '\'' +
                ", companyState='" + companyState + '\'' +
                ", companyZip='" + companyZip + '\'' +
                '}';
    }
}

Можете ли вы объяснить, «как» FetchType.LAZY и CascadeType.All блокируют удаление?

Milan Desai 15.05.2019 16:08

Не знаю. Но я заметил, что Hibernate делает запрос к таблице компаний всякий раз, когда я вызываю метод «удалить», поэтому я решил попробовать изменить сущность компании.

user2743227 15.05.2019 16:15

Другие вопросы по теме