Не могу удалить вложенные объекты в Hibernate - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть 3 объекта Report, GaragingReport и GaragingReportData.

Отчет имеет составной ключ (reportid, userid).GaragingReport расширяет Report и имеет список GaragingReportData в качестве перезапуска OneToMany.

Я пытаюсь выполнить следующий запрос JPARepository, чтобы удалить все отчеты старше 90 дней:

    void deleteByCreatedDateBefore(LocalDateTime expiryDate);

Но яя получаю ошибку ограничения, говорящую мне, что внешние ключи не могут быть нулевыми.Я уже установил casecade.ALL и deleteOrphans = true, но все равно не повезло.

Отчет:

@Entity
@IdClass(Report.Keys.class)
@Inheritance(strategy = InheritanceType.JOINED)
@OnDelete(action = OnDeleteAction.CASCADE)
@Table(name = "reports", schema = "public")
public class Report {

    @Id
    @Getter
    @Setter
    private String id;

    @Id
    @Getter @Setter
    @Column(name="userid")
    private String userid;

    @Getter @Setter
    private String name;

    @Getter
    @Column(name="created_date")
    private LocalDateTime createdDate;

GaragingReport:

@Entity
@Table(name = "garagingreports", schema = "public")
@OnDelete(action = OnDeleteAction.CASCADE)
public class GaragingReport extends Report {

    @OneToMany(
            cascade = {CascadeType.ALL},
            orphanRemoval = true
    )
    @JoinColumns ({
            @JoinColumn(
                    name = "reportid",
                    referencedColumnName = "id"),
            @JoinColumn(
                    name = "userid",
                    referencedColumnName = "userid")
    })
    @Getter @Setter
    private List<GaragingReportData> data = new ArrayList<>();

GaragingReport Data:

@Entity
@IdClass(GaragingReportData.IdClass.class)
@Table(name = "garagingreportdata", schema = "public")
public class GaragingReportData implements CSVSerializable {

    private static final int CLUSTER_NUMBERS = 3;

    @Id
    @Getter @Setter
    private String reportid;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(
                    name = "reportid",
                    referencedColumnName = "id", insertable = false, updatable = false),
            @JoinColumn(
                    name = "userid",
                    referencedColumnName = "userid", insertable = false, updatable = false)
    })
    @Getter @Setter
    private GaragingReport report;

    @Id
    @Getter @Setter
    @Column(name = "userid")
    private String userid;

    @Id
    @Getter @Setter
    private String domain;

    @Getter @Setter
    @Column(name="garaging_metric")
    private Double garagingMetric;

    @Getter @Setter
    @Column(name="garaging_distance")
    private Double garagingDistance;

    @Getter @Setter
    @Column(name="strix_location_lat")
    private Double strixLocationLat;

    @Getter @Setter
    @Column(name="strix_location_lng")
    private Double strixLocationLng;

    @Getter @Setter
    @Column(name="strix_address")
    private String strixAddress;

    @Getter @Setter
    @Column(name="estimated_kms")
    private Double estimatedKms;


    @OneToMany(
            cascade = {CascadeType.ALL},
            orphanRemoval = true
    )
    @JoinColumns ({
            @JoinColumn(
                    name = "reportid",
                    referencedColumnName = "reportid"),
            @JoinColumn(
                    name = "userid",
                    referencedColumnName = "userid"),
            @JoinColumn(
                    name = "domain",
                    referencedColumnName = "domain")
    })
    @Getter @Setter
    private List<GaragingReportDataCluster> clusters = new ArrayList<>();

Кроме того, если я пытаюсь удалить одну сущность, я получаю следующее исключение: DataIntegrityViolationException - дубликат ключа.Но я ничего не вставляю, просто repository.delete (отчет)

Спасибо

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