diff --git a/callbacks/callbacks.go b/callbacks/callbacks.go index e72f561e..d681aef3 100644 --- a/callbacks/callbacks.go +++ b/callbacks/callbacks.go @@ -24,10 +24,6 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { return !db.SkipDefaultTransaction } - canAddr := func(db *gorm.DB) bool { - return db.Statement.ReflectValue.CanAddr() - } - if len(config.CreateClauses) == 0 { config.CreateClauses = createClauses } @@ -43,11 +39,11 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { createCallback := db.Callback().Create() createCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) - createCallback.Match(canAddr).Register("gorm:before_create", BeforeCreate) + createCallback.Register("gorm:before_create", BeforeCreate) createCallback.Register("gorm:save_before_associations", SaveBeforeAssociations(true)) createCallback.Register("gorm:create", Create(config)) createCallback.Register("gorm:save_after_associations", SaveAfterAssociations(true)) - createCallback.Match(canAddr).Register("gorm:after_create", AfterCreate) + createCallback.Register("gorm:after_create", AfterCreate) createCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) createCallback.Clauses = config.CreateClauses @@ -69,11 +65,11 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { updateCallback := db.Callback().Update() updateCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) updateCallback.Register("gorm:setup_reflect_value", SetupUpdateReflectValue) - updateCallback.Match(canAddr).Register("gorm:before_update", BeforeUpdate) + updateCallback.Register("gorm:before_update", BeforeUpdate) updateCallback.Register("gorm:save_before_associations", SaveBeforeAssociations(false)) updateCallback.Register("gorm:update", Update(config)) updateCallback.Register("gorm:save_after_associations", SaveAfterAssociations(false)) - updateCallback.Match(canAddr).Register("gorm:after_update", AfterUpdate) + updateCallback.Register("gorm:after_update", AfterUpdate) updateCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) updateCallback.Clauses = config.UpdateClauses diff --git a/callbacks/create.go b/callbacks/create.go index e94b7eca..a64a1665 100644 --- a/callbacks/create.go +++ b/callbacks/create.go @@ -12,6 +12,9 @@ import ( // BeforeCreate before create hooks func BeforeCreate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeCreate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.BeforeSave { @@ -150,6 +153,10 @@ func Create(config *Config) func(db *gorm.DB) { // AfterCreate after create hooks func AfterCreate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterCreate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.AfterCreate { diff --git a/callbacks/update.go b/callbacks/update.go index 01f40509..895ebd4a 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -31,6 +31,10 @@ func SetupUpdateReflectValue(db *gorm.DB) { // BeforeUpdate before update hooks func BeforeUpdate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeUpdate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.BeforeSave { @@ -103,6 +107,10 @@ func Update(config *Config) func(db *gorm.DB) { // AfterUpdate after update hooks func AfterUpdate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterUpdate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.AfterUpdate {