Почему delete-orphan нуждается в "cascade all" для запуска в JPA / Hibernate? - PullRequest
2 голосов
/ 29 января 2010

Я пытаюсь отобразить отношение «один ко многим» с помощью каскада «удалить» (jpa) и «удалить-сироту», потому что я не хочу, чтобы дети сохранялись или сохранялись при сохранении или сохранении родителя (безопасность причины из-за клиента к серверу (GWT, Gilead))

Но эта конфигурация не работает. Когда я пытаюсь с каскадом «все», он работает. Почему для запуска опции удаления-сироты необходим каскад «все»?

Вот код (без идентификатора или других полей для простоты класс Thread определяет простое свойство многие-к-одному без каскада): при использовании функции removeThread в транзакционной функции она не запускается, но если я редактирую cascade.Remove в cascade.All, она запускается.

@Entity
public class Forum 
{   
private List<ForumThread>   threads;


/**
 * @return the topics
 */
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
public List<ForumThread> getThreads()
{
    return threads;
}

/**
 * @param topics the topics to set
 */
public void setThreads(List<ForumThread> threads)
{
    this.threads = threads;
}

public void addThread(ForumThread thread)
{
    getThreads().add(thread);
    thread.setParent(this);
}

public void removeThread(ForumThread thread)
{
    getThreads().remove(thread);
}

}

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

Согласно Java Постоянство с Hibernate , каскадное удаление сирот недоступно в качестве аннотации JPA.

Также не поддерживается в JPA XML.

0 голосов
/ 27 мая 2010

Для hibernate, REMOVE и DELETE означают одно и то же, проверьте. AnnotationBinder # getCascadeStrategy ()

      while ( cascadeType.hasNext() ) {
        switch ( cascadeType.next() ) {
            case ALL:
                cascade.append( "," ).append( "all" );
                break;
            case SAVE_UPDATE:
                cascade.append( "," ).append( "save-update" );
                break;
            case PERSIST:
                cascade.append( "," ).append( "persist" );
                break;
            case MERGE:
                cascade.append( "," ).append( "merge" );
                break;
            case LOCK:
                cascade.append( "," ).append( "lock" );
                break;
            case REFRESH:
                cascade.append( "," ).append( "refresh" );
                break;
            case REPLICATE:
                cascade.append( "," ).append( "replicate" );
                break;
            case EVICT:
                cascade.append( "," ).append( "evict" );
                break;
            case DELETE:
                cascade.append( "," ).append( "delete" );
                break;
            case DELETE_ORPHAN:
                cascade.append( "," ).append( "delete-orphan" );
                break;
            case REMOVE:
                cascade.append( "," ).append( "delete" );
                break;
                }
                        }

Так что для Хиберанте нет разницы между УДАЛИТЬ или УДАЛИТЬ, это одно и то же! Поскольку JPA, hibernate, не соблюдает аннотацию CascadeType.DELETE для дочерних элементов, может быть той же причиной, они также игнорируются для CascadeType.REMOVE.

Попробуйте с CascasdeType.REFRESH, если это поможет (только предположение)

...