问题内容
我有以下代码:
type innerstructa struct {
a string
}
type innerstructb struct {
b string
}
func (a *a) beforecreate(scope *gorm.scope) error {
return scope.setcolumn("a", uuid.new().string())
}
func (b *b) beforecreate(scope *gorm.scope) error {
return scope.setcolumn("b", uuid.new().string())
}
type outerstruct struct {
innerstructa
innerstructb
id string `gorm:"type:varchar(40);not null"`
}
当我创建记录时:
outerStructObject := OuterStruct{
ID: "sample_ID",
}
err := db.Create(&outerStructObject).Error
仅调用 beforecreate() 挂钩之一。其他 beforecreate 被跳过。
gorm版本为jinzhu/gorm v1.9.16
有没有一种方法可以在调用 create 语句时调用两个钩子?
预计为两个内部结构调用 beforecreate 挂钩 - innerstructa 和 innerstructb。
正确答案
peter 的评论是准确的,我将在这里分享我的测试和评论,但使用官方存储库 go -gorm/gorm 和最新版本 v1.25.0
具有非常相似的结果和 api 中的一些更改。
创建外部注册表时,内部对象可以这样设置:
func (o *outerstruct) beforecreate(tx *gorm.db) error {
fmt.println("hook triggered: beforecreate for outerstruct")
o.innerstructa.a = uuid.new().string()
o.innerstructb.b = uuid.new().string()
return nil
}
要触发内部对象钩子,只能通过直接创建它们:
innera := innerstructa{
a: "123",
}
errcreateinner := db.create(&innera).error
这是一个完整的孤立示例:
package main
import (
"fmt"
"log"
"github.com/google/uuid"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func main() {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&InnerStructA{}, &InnerStructB{}, &OuterStruct{})
outerStructObject := OuterStruct{
ID: "sample_ID",
}
errCreate := db.Create(&outerStructObject).Error
if err != nil {
log.Fatal(errCreate)
}
var outer OuterStruct
db.Last(&outer)
fmt.Println("Last register: ", outer)
// innerA := InnerStructA{
// A: "123",
// }
// errCreateInner := db.Create(&innerA).Error
// if err != nil {
// log.Fatal(errCreateInner)
// }
}
type InnerStructA struct {
A string
}
type InnerStructB struct {
B string
}
// This is not being called
func (a *InnerStructA) BeforeCreate(tx *gorm.DB) error {
fmt.Println("Hook triggered: BeforeCreate for InnerStructA")
// ...
return nil
}
// This is not being called
func (b *InnerStructB) BeforeCreate(tx *gorm.DB) error {
fmt.Println("Hook triggered: BeforeCreate for InnerStructB")
// ...
return nil
}
// This works!
func (o *OuterStruct) BeforeCreate(tx *gorm.DB) error {
fmt.Println("Hook triggered: BeforeCreate for OuterStruct")
o.InnerStructA.A = uuid.New().String()
o.InnerStructB.B = uuid.New().String()
return nil
}
type OuterStruct struct {
InnerStructA
InnerStructB
ID string `gorm:"type:varchar(40);not null"`
}
以上就是有没有办法为结构内的每个结构执行 BeforeCreate 和 BeforeUpdate 挂钩?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java FXML 国际化如何进行操作?(java fxml国际化怎么操作)
- Java Jersey 如何实现跨域请求?(详细教程及示例代码)(java jersey如何实现跨域请求)
- Java 中如何识别 jfif 格式图片?(Java中jfif格式图片如何识别)
- 如何查看和解决 Java 内存泄露?(java内存泄露怎么查看和解决)
- Java iBATIS 的安全性如何得以保障?(java ibatis安全性如何保障)
- 如何在 Java 中实现与 SQLite 数据库的连接?(java如何连接sqlite数据库)
- 2025年软考信息处理技术员报名条件与要求
- 2025年软考信息系统管理工程师报名条件与要求
- 2025年软考程序员报名条件与要求
- 2024下半年广东软考成绩复查时间及流程
猜你喜欢
AI推送时光机 咦!没有更多了?去看看其它编程学习网 内容吧