0

次のエンティティがあります

class Thesis extends Article {
   String description
   Topic topic
   User assignee
   User supervisor
   ...
   static constraints = {
       supervisor nullable: true
   ...
      supervisor validator: {supervisor ->
         if (supervisor?.id != null && !User.get(supervisor.id)) {
            'not.found'
         }
      }
   }
}

スーパーバイザーなしで新しいインスタンスを作成して保存すると、問題なく動作します。

ただし、既存の Thesis インスタンスからスーパーバイザーを削除 (null に設定) しようとすると、TransientObjectException が発生します。フォームデータを thesisInstance にバインドせず、単に「スーパーバイザー」プロパティを null に設定すると、問題なく保存されるため、データバインディングについて何かが欠けている可能性があります。

def thesisInstance = Thesis.get(id)
thesisInstance.properties = params.thesis
if (thesisInstance.supervisorId == null){
   thesisInstance.supervisor = null
}
thesisInstance.save()

編集: params.thesis マップは次のようになります (免責事項: これらはダミー データです)

thesis.tags.title: ruby
thesis.version: 7
thesis.topic.id: 13
thesis.supervisor.id: 
thesis.status: FINISHED
thesis.id: 18
thesis.title: Implementation of Ruby Killing Machine
thesis.type: BACHELOR
thesis.assignee.fullName: Somebody
thesis.university.id: 1
thesis.grade: A
thesis.supervisor.fullName: 
thesis.thesisAbstract: Implementation of Ruby Killing Machine that will kill people that are filled in an HTML form.
thesis.description: Implementation of Ruby Killing Machine that will kill people that are filled in an HTML form.
thesis.assignee.id: 4

ご覧のとおり、thesis.supervisor.id は入力されていないため、thesisInstance.supervisor は ID なしで新しいユーザー インスタンスに設定されています。したがって、「thesisInstance.supervisor = null」の必要性

[1] でまったく同じ問題を見つけましたが、未回答です。

[1] http://grails.1312388.n4.nabble.com/Data-Binding-and-Null-ifying-problems-in-G1-2-0-td1339929.html

4

0 に答える 0