【问题标题】:GORM cannot create new entity using addToGORM 无法使用 addTo 创建新实体
【发布时间】:2025-11-30 19:30:01
【问题描述】:

我有一个带有以下内容的类 SheetLayout:

private String size
private int xPosition
private int yPosition

private Sheet sheet
private Report report

static belongsTo=[sheet : Sheet]

还有一个具有以下内容的类表:

@Id
private String id

private Date created = new Date()
private Date modified
private String title
private int sheetIndex
private String type

private Dashboard dashboard

static hasMany = [sheetLayouts : SheetLayout, slicersWidgets : SlicerWidget]

static belongsTo=[dashboard : Dashboard]

现在我正在尝试以任何可能的方式(使用或不使用 Sheet)保存 SheetLayout,但它不起作用。 我尝试过的选项之一:

def testsl(){
        Sheet s = Sheet.findById("AAAAAaaaaaAAAaaaAA")
        SheetLayout sl = new SheetLayout()
        sl.setxPosition(0)
        sl.setyPosition(1)
        sl.setSize("satas")
        s.addToSheetLayouts(sl)
        s.save(flush:true)

    }

它只是不工作:(

有什么想法吗?

【问题讨论】:

  • 如果你有static belongsTo=[sheet : Sheet],你就不需要private Sheet sheet。但我不知道它是否能解决问题
  • 谢谢我在尝试,但它仍然没有帮助。我认为这是因为我现在也有具有静态 hasMany = [sheetLayouts : SheetLayout] 的实体 Report,当我尝试保存 SheetLayout 时它不起作用,因为我需要在 SheetLayout 对象的 report_id 中有值。
  • 如果有错误堆栈跟踪,你能发布吗?
  • 你试过打印一些数据吗?找到单子了吗?保存时也要写...save(flush: true, failOnError: true),这样保存时会显示错误
  • 您应该删除所有出现的private。删除它们将为您提供私有字段以及公共 getter 和 setter,这是您想要的所有持久属性。

标签: java grails grails-orm


【解决方案1】:

GORM 无法使用 addTo 创建新实体

我认为这不是真的。以下作品:

Sheet.groovy

class Sheet {
    // consider using GORM auto timestamp properties for these Dates...
    Date created
    Date modified

    String title
    int sheetIndex
    String type

    static hasMany = [sheetLayouts : SheetLayout]
}

SheetLayout.groovy

class SheetLayout {
    String size
    int xPosition
    int yPosition

    Sheet sheet

    static belongsTo = [sheet : Sheet]
}

持久化实例的代码:

    def now = new Date()
    Sheet s = new Sheet(created: now, modified: now, title: 'Some Title', sheetIndex: 42, type: 'wilbur')
    SheetLayout sl = new SheetLayout()
    sl.setxPosition(0)
    sl.setyPosition(1)
    sl.setSize("satas")
    s.addToSheetLayouts(sl)
    s.save(flush:true, failOnError: true)

你也可以这样做:

    def now = new Date()
    Sheet s = new Sheet(created: now, modified: now, title: 'Some Title', sheetIndex: 42, type: 'wilbur')
    s.addToSheetLayouts(xPosition: 0, yPosition: 1, size: 'satas')
    s.save(flush:true, failOnError: true)

我建议您在尝试保存实例后检查errors 属性和/或使用failOnError:true

编辑:

我刚刚重新阅读了您的示例,看起来您的 SheetLayout 类具有您未初始化的 report 属性。除非您使用 nullable: true 进行了配置,否则这将是您问题的一部分。

【讨论】: