【问题标题】:Grails Hibernate Insert instead of update tableGrails Hibernate 插入而不是更新表
【发布时间】:2013-09-12 15:01:41
【问题描述】:

在我当前更新函数的保存部分(我尝试了flush:true和insert:true)每次尝试都会执行插入。

我要更新的列是主键,但在 mysql 数据库中,我在所有外键使用中都有 ON UPDATE CASCADE。

在 grails 或其他地方我还有什么需要注意的吗?

更新: 我有以下表格:

CREATE  TABLE IF NOT EXISTS `Station` (
  `Name` CHAR(50) NOT NULL ,
  `Location_Designation` CHAR(50) NOT NULL ,
  PRIMARY KEY (`Name`, `Location_Designation`) ,
  INDEX `fk_Station_Location1_idx` (`Location_Designation` ASC) ,
  CONSTRAINT `fk_Station_Location_LocatedIn`
    FOREIGN KEY (`Location_Designation` )
    REFERENCES `Location` (`Designation` )
    ON DELETE NO ACTION
    ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `Location` (
  `Designation` CHAR(50) NOT NULL ,
  PRIMARY KEY (`Designation`) )
ENGINE = InnoDB;

我的圣杯:

​​>
stationInstance.properties = params
//Station = "S1", Location="test"

if (!stationInstance.save(flush: true)) { // }

更新 2: 这是我的休眠在更新命令中所做的:

Hibernate: select station_.name, station_.Location_Designation as Location2_2_ from station station_ where station_.name=?
Hibernate: insert into station (Location_Designation, name) values (?, ?)

【问题讨论】:

  • 显示您尝试过的示例。
  • @dmahapatro 我用表格更新了问题。感谢您(再次)帮助我!

标签: mysql hibernate grails


【解决方案1】:

如果您要更新主键,您可能无法在此处保存。您可能需要像这样将 HQL 与 executeUpdate 一起使用:

Station.executeUpdate("update Station s set s.name=? where s.name=?", name2, name1)

【讨论】:

  • 这是解决这个“问题”的常见方法,还是有办法通过例如以更准确的方式定义域来避免我的情况?无论如何,这有帮助。谢谢!
  • @malte:一般规则是不使用数据字段作为主键,而是使用自动生成的字段或类似的东西。你不想更新你的主键,特别是因为它可能是在许多其他地方使用的外键。此外,当 Grails 只有一个可以用作 id 的字段时,它似乎工作得更好。
  • 好的,谢谢!我已经被推向那个方向了。但是,如果它是一个数据库驱动的开发并且“数据库工程师”在没有注意到我呻吟的情况下做了这些事情怎么办?那么上面的解决方案就是我必须来实现的,对吗? :)
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多