0

別のオブジェクトと多対多の関係が存在する場合、コンテンツを削除する際に問題が発生します。

削除を実行するには、名前付きクエリの配列があり、削除するには、次のように、配列をループしてエンティティごとに削除を実行します。

private static final String[] DELETE_CONTENT_QUERY_NAMES = {
    "Entity1.deleteByContentId",
    "Entity2.deleteByContentId",
    "Entity3.deleteByContentId",
    "Entity4.deleteByContentId",
    "Entity5.deleteByContentId",
    "EntityWithManyToMany.deleteByContentId",
    "Entity7.deleteByContentId",
    "Content.DeleteByContent"
}; 

@Override
@Transactional
public void deleteContent(Content content) throws Exception{
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("contentId", content.getContentId());
    for (String queryName : DELETE_CONTENT_QUERY_NAMES) {
        dao.batchDeleteByNamedQuery(queryName, params);
    }
}

繰り返しでEntityWithManyToMany.deleteByContentId HQL バッチ クエリを実行しようとすると、ログに変換された sql 命令が表示されますが、その後に同じ行の一連の挿入が続き、MySQL は正しく制約エラーを返します。

これは、削除しようとしている多対多の関係オブジェクトです。

@Entity
@Embeddable
public class CategoryContent implements java.io.Serializable {

    /***
     *  Private Declarations
     */
    @EmbeddedId
    @AttributeOverrides({
         @AttributeOverride(name = "contentId", column = @Column(
                name = "CONTENT_ID", 
                nullable = false, precision = 10, scale = 0)), 
         @AttributeOverride(name = "categoryId", column = @Column(
                name = "CATEGORY_ID",
                nullable = false, precision = 10, scale = 0))
    })
    @NotNull
    private CategoryContentId id;

    @ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.PERSIST)
    @JoinColumn(name = "CATEGORY_ID", insertable=false, updatable=false)
    private Category category;

    @ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.PERSIST)
    @JoinColumn(name = "CONTENT_ID", insertable=false, updatable=false)
    private Content content;

    @Column(name = "PRIORITY", nullable = true)
    private Integer priority;
}

問題がCascadeTypeに関係している可能性があると思いますか? どうすればこれを解決できますか?

どんな提案でも大歓迎です!

どうもありがとう、ダビデ。

4

1 に答える 1

0

あなたは正しい道を進んでいます - カスケードを次のように修正してみてください

cascade = {CascadeType.PERSIST, CascadeType.DELETE}

結合テーブルがあるため、これは機能するはずです。

于 2011-10-31T15:58:31.293 に答える