Я создал такой класс плана
Строить планы:
@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. Что я делаю неправильно?
Это долгий путь, но вы пытались изменить тип идентификатора с int на Integer? Из Документация по спящему режиму: мы рекомендуем объявлять атрибуты идентификатора с согласованными именами в постоянных классах и использовать тип, допускающий значение NULL (т. е. не примитивный).
На самом деле он не выполняет никакого SQL. Я также попытался изменить PK на Integer, и это тоже не помогло.
Вам нужно добавить аннотацию @Service/@Component из класса, который вы вызываете deleteCompanyPlan(), и/или самого класса, который определяет deleteCompanyPlan()
Вы не можете изменить данные без транзакции... Судя по вашему методу, там нет @Transactional (или компонента). Следовательно, ничего не будет удалено.
planRepository.deleteById(3);опечатка? planRepository.deleteById(planEntity.getPlanId());Вам не нужен @Transactional в ваших методах репозитория. Также нет необходимости в аннотации @Service/@Component. Я бы рекомендовал установить журналы гибернации на уровень TRACE (в Spring «logging.level.org.hibernate: trace») и проверить журналы, в которых должно произойти удаление. Я предполагаю, что вам нужно установить CASCADE.DELETE в аннотации @ManyToOne.




Проблема устранена путем удаления 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 блокируют удаление?
Не знаю. Но я заметил, что Hibernate делает запрос к таблице компаний всякий раз, когда я вызываю метод «удалить», поэтому я решил попробовать изменить сущность компании.
Действительно ли он выполняет какой-либо SQL? Если вы еще этого не сделали, попробуйте установить свойство spring.jpa.show-sql=true, чтобы узнать, выводит ли оно что-нибудь при удалении?