grails domainではbeforeinsertが無効です

1697 ワード

今日grailsプロジェクトを新規作成しましたが、保存を実行するときはいつもエラーが発生します.
class Manipulator {
	String name;
	String passwd;
	String createTime;
	String updateTime;
    int isDeleted=0;//0 ,1, 
	
	static constraints = {
		name unique: true 
    }
	
	def beforeInsert = {
		createTime = utils.DateUtil.getStrDate(null, null);
	}
	
	def beforeUpdate = {
		updateTime = utils.DateUtil.getStrDate(null, null);
	}
}

 
なぜかbeforinsertはなかなか作動せず、
その後saveを実行する前にcreateTimeとupdateTimeに値を割り当て、保存できます.
データベースの問題ではなく、設定の問題であることがわかりました.
 
configを表示する.groovyなどのプロファイルの後も問題は見つかりませんでした.
 
後でコードをチェックしました
class Manipulator {
	String name;
	String passwd;
	String createTime;
	String updateTime;
    int isDeleted=0;//0 ,1, 
	
	static constraints = {
		name unique: true 
		createTime blank:true ,nullable:true;
		updateTime blank:true ,nullable:true;
    }
	
	def beforeInsert = {
		createTime = utils.DateUtil.getStrDate(null, null);
	}
	
	def beforeUpdate = {
		updateTime = utils.DateUtil.getStrDate(null, null);
	}
}

 
コンストレイントを追加しました.空でもnullでも、保存に成功したのは時間だけです.
 
このデザインはちょっと不合理ですね.でも、仕方がありません.デザインはこうです.
 
この中にも一つの問題が現れている.domainの制約はコードレベルであり、データベースには関係ありません.
すべての制約チェックは、プログラムが実行されたときに完了します.この時間は、データベースを挿入する前に、つまりデータベース制約がまだ機能していません.
 
これからはdomainの制約とデータの制約の違いに注意しましょう
 
マークちょっと
 
===============================================================================