2011-02-10 2 views
2

Я использую следующие в JPA:связанные удалить @OneToOne автоматически в JPA

@Entity 
class ParentClass { 
    @Id 
    @GeneratedValue 
    private long id; 
    ... 
    @OneToOne(cascade = { cascade = { CascadeType.ALL }, 
         mappedBy = "parentClass") 
    ChildClass child; 
    .. 
} 

@Entity 
class ChildClass { 

    @OneToOne 
    ParentClass parentClass; 

} 

Если я делаю запрос как CreateQuery («DELETE FROM ParentClass ПК»), мой ребенок класс не удаляется автоматически.

Можно ли это сделать с помощью JPA-2.0? (Я работаю с отношениями @OneToMany).

ответ

4

Объемные запросы DML, такие как DELETE FROM ParentClass pc игнорировать каскадные варианты и orphanRemoval, так что если вы на самом деле нужно сделать это в объемном запросе, вы не можете настроить JPA для удаления ChildClass эсов автоматически.

Однако вы можете настроить свою базу данных для этого, добавив ограничение REFERENCES ... ON DELETE CASCADE к ключу foregin от ChildClass в вашей схеме базы данных.

+1

+1 Я считаю, что это правильный ответ. Я думаю, что ON DELETE CASCADE может привести к некоторым небольшим проблемам, потому что провайдер JPA не подберет это. Поэтому, если позже вы решите снова называть что-то вроде em.persist (child), JPA подумает, что оно уже сохраняется и т. Д. Кроме того, ребенок не будет удален из кеша и т. Д. –

+0

Спасибо, я не очень нужен сделать «Bulk» Query, поэтому я заменил его простым remove(). Я не пытался делать ССЫЛКИ ... CASCADE, поскольку я ожидаю, что это зависит от СУБД и не является частью стандартного SQL? – Roalt

3

В JPA2 вы можете установить orphanRemoval = true на аннотацию @OneToOne. Однако я бы сказал, что CascadeType.ALL должен это обработать. Что делать, если вы вызываете em.remove (parentClass) вместо вызова запроса.

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