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
для этих значений.