2015-09-29 3 views
1

У меня есть два класса Java Java. Теперь я пытаюсь удалить запись из родительского объекта, но она выдавала ошибку: org.hsqldb.HsqlException: integrity constraint violation: foreign key no action; SYS_FK_10142 table: CHILD.Попытка удалить запись из родительского объекта java class

**Parent class** 
@Entity 
@Table(name = "Parent") 
public class Parent 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @NotBlank 
    @Column(name = "data") 
    private String data; 
    public Long getId() 
    { 
    return id; 
    } 
    public void setId(Long id) 
    { 
    this.id = id; 
    } 

    public String getData() 
    { 
    return data; 
    } 

    public void setData(String data) 
    { 
    this.data = data; 
    } 
} 

**Child class** 

@Entity 
@Table(name = "Child") 
public class Child 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @NotBlank 
    private String model; 

    @ManyToOne() 
    @OnDelete(action= org.hibernate.annotations.OnDeleteAction.CASCADE) 
    private Parent parent; 

    public Long getId() 
    { 
    return id; 
    } 

    public void setId(Long id) 
    { 
    this.id = id; 
    } 

    public String getModel() 
    { 
    return model; 
    } 

    public void setModel(String model) 
    { 
    this.model = model; 
    } 
} 
+0

попробуйте также указать действие «OnUpdate». – mergenchik

+0

Можете ли вы опубликовать код, в котором вы удаляете родителя? – user2953113

ответ

0

Поскольку вы удаление родительской записи и ожидая, связанные дочерние записи также должны быть удалены, возможно, потребуется двунаправленная связь.

@Entity 
@Table(name = "Parent") 
public class Parent 
{ 
    ... 
    ... 
    @OneToMany(mappedBy = "parent", cascade = javax.persistence.CascadeType.REMOVE) 
    private List<Child> children; 

} 

@Entity 
@Table(name = "Child") 
public class Child 
{ 
    ... 
    ... 
    @ManyToOne 
    @JoinColumn(name="parent_id", referencedColumnName="id") 
    private Parent parent; 


} 
+0

iirc, объявляя 'CascadeType.REMOVE', не собирается удалять дочерние элементы, а просто удаляет отношения. Я считаю, что вам нужно «orphanRemoval = true», если вы хотите, чтобы дети были удалены. –

+1

@AdrianShum: Ваш комментарий не совсем корректен. Если вы вызываете em.remove (parent) с 'CascadeType.REMOVE', все ссылки на дочерние сущности также удаляются. См. Doc для [УДАЛИТЬ] (http://www.objectdb.com/java/jpa/persistence/delete#Cascading_Remove_). С другой стороны, 'orphanRemoval = true' необходимо только, если вы хотите удалить дочерние сущности, когда вы просто удаляете его из коллекции родителей, например. когда вы вызываете parent.children.remove (child). – OndrejM

+0

Спасибо за исправление :) Я, должно быть, смешал их –

Смежные вопросы