Hibernate устанавливает значение null для внешнего ключа при удалении объекта

у меня есть следующие Hibernate entites:

@Entity
@Table(name = "model_view")
public class ModelView {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "modelView_id")
    private Integer id;

    @ManyToOne
    @NotNull
    @JoinColumn(name = "page_id", nullable = false, insertable = true, updatable = true)
    private Page page;

    /* getters and setters */
}

и:

@Entity
public class Page {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "page_id")
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "page_id")
    @IndexColumn(name = "modelView_id")
    private Set<ModelView> modelViews = new HashSet<ModelView>();

    /* getters and setters */
}

когда я удаляю сущность "ModelView" в DAO, у меня есть исключение:

ORA-01407: unable to replace ("MODEL_VIEW"."PAGE_ID") to NULL

что не так? Почему hibernate установил внешний ключ в NULL перед удалением?

1 ответов


почему hibernate установил внешний ключ в NULL перед удалением?

Hibernate пытается разыменовать запись, которую вы пытаетесь удалить, обнуляя FK. К сожалению, в большинстве случаев FKs не являются недействительными. Вы должны сказать Hibernate не обновлять ModelView случаи, когда удаление Page записей.

попробуйте изменить insertable и updatable false в @JoinColumn отображение page на ModelView:

@JoinColumn(name = "page_id", nullable = false, insertable = false, updatable = false)

при использовании эти значения ModelView записи останутся. Опять же, это не сработает, если вы применяете ссылочную целостность. Чтобы обойти это, вам нужно включить каскадных удалений. Я замечаю, что в вашем коде вы уже используете CascadeType.ALL который должен работать просто отлично.

вот так Q&A, который объясняет эти поля:

в JPA почему и как использовать вставляемый и обновляемый параметр?

у меня была аналогичная проблема, которая была исправлена с помощью false для этих значений.

как сопоставить "insert=' false 'update= 'false' "с ключом-свойством composite-id, которое также используется в FK "один ко многим"?