3

インシデント、問題、カテゴリ、影響、緊急度などのドメイン クラスがあります。

Class Incident
{
   Category category
   String subject
   Impact impact
}

Class Problem
{
     Urgency urgency
     Category category
     String title
}
Class Category
{
    String categoryName
    String description
}

現在、いくつかの行がこのクラスに挿入されています。カテゴリを削除すると、「grailsは親行を削除または更新できません」などのエラーがスローされます..では、削除するにはどうすればよいですか?

4

2 に答える 2

5

問題は、インシデントと問題のクラスでカテゴリを参照しているため、これらのクラスのデータベース テーブルにはカテゴリ テーブルの外部キーがあるため、これらのインシデント/問題を削除するか、それらのインシデントの問題を更新するまでカテゴリを削除できず、カテゴリを null に設定します (ドメインの制約で null 可能にする必要があります)。

だからどちらか

Problem.executeUpdate('update Problem p set category = null where category = ?', [category])

インシデントも同様

または、begsTo と hasMany を使用してドメイン クラスをモデル化すると、grails がすべてを自動的に処理します。

何かのようなもの

class Problem {
    static belongsTo = [category:Category]
}

class Category {
  static hasMany = [
     problems: Problem
 ]
 static mappings = {
   problems cascade: "all-delete-orphan"
 }
}

単に参照を使用するのではなく、begsTo、hasMany、hasOne を使用して関係を管理することをお勧めします。これにより、モデルがより適切に表現されます。

ドメインモデルにも依存します。ビジネスで問題が発生する可能性があります。インシデントはカテゴリなしで存在します。または、何らかのカテゴリに属している必要があります。あなたの答えが最初のオプションである場合、削除をカスケードしたくありませんが、答えが2番目のオプションである場合は、これらのインシデント/問題をnullカテゴリで更新します-すべて削除-孤児をカスケードする必要があります

于 2012-06-09T08:19:35.457 に答える
0

カテゴリがどのように見えるか、それはインシデント ドメイン クラスに属しているか、カテゴリが何らかのドメイン クラスに属している場合、それを削除することはできません。参照:こちらをご覧ください

于 2012-06-09T06:40:05.603 に答える