2

親が保存または永続化されているときに子を保存または永続化させたくないため、カスケード「削除」(jpa) および「delete-orphan」を使用して 1 対多の関係をマップしようとしています (セキュリティ上の理由によるクライアントからサーバーへ (GWT、Gilead))

しかし、この構成は機能しません。カスケード「すべて」で試してみると、実行されます。delete-orphan オプションを実行するためにカスケード "all" が必要なのはなぜですか?

コードは次のとおりです (簡単にするために id やその他のフィールドはありません。クラス Thread は、カスケードなしで単純な多対 1 のプロパティを定義します):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);
}

}
4

2 に答える 2

2

Java Persistence with Hibernateによると、cascade orphan delete は JPA アノテーションとして使用できません。

また、JPA XML でもサポートされていません。

于 2010-05-27T01:34:58.540 に答える
0

休止状態の場合、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;
                }
                        }

したがって、Hiberante の場合、REMOVE と DELETE の間に違いはなく、同じことです。JPA、休止状態は、子要素の CascadeType.DELETE アノテーションを尊重しないため、同じ理由である可能性があり、CascadeType.REMOVE に対しても無視されます。

それが役立つ場合は CascasdeType.REFRESH を試してください(単なる推測です)

于 2010-05-27T19:00:09.030 に答える