问题标签 [grails-orm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5710 浏览

grails - Grails GORM 组合还是 hasOne?

我对使用静态 hasOne 映射和在域类中组合对象之间的区别有点困惑。两者有什么区别?IE。

相对

其中,GraduateCommittee 是另一个 GORM 领域模型类。

0 投票
0 回答
696 浏览

hibernate - Grails乐观锁定奇怪行为

我一直试图让 GORM 在集成测试中抛出乐观锁定错误。之前有人说过,如果不使用多个线程,就不可能测试并发更新错误,但即便如此,我发现我的测试用例的行为令人惊讶:

重新挂载的Widget实例不会持久化到数据库中,但不会抛出异常!

我的测试用例相当做作,但我仍然对结果感到惊讶。

有人可以解释一下吗?

0 投票
2 回答
682 浏览

grails - GORM list() 只返回超类对象

我有一个简单的对象层次结构,我想使用 list() 查询每个对象。问题在于,由于多态性,Task.list() 会同时返回 Task 类型和 ComplexTask 类型的实例。

我意识到我可以通过拥有一个通用的抽象超类来解决我的问题,或者根据返回的类型过滤结果,但我想知道是否有一种方法可以使用动态查找器并仅获取超类实例。

0 投票
3 回答
2441 浏览

grails - 在 Grails 中映射遗留数据库表时避免表更改?

我有一个应用程序,其中包含一些从 Grails 域类自动生成的表和一个legacy在 Grails 之外创建但由 Grails 域类映射的遗留表(比如 table )。映射遗留数据库中的列是微不足道的,但我想禁用 Grails 尝试为所述表处理的额外字段和索引的添加。

我的问题是:如何指示 Grails 不要对表进行任何表更改legacy(例如添加索引、外键、版本列等更改)?

请注意,我不想禁用所有表的自动模式生成/更新,仅适用于映射表legacy

0 投票
2 回答
2705 浏览

sql - 访问 hql 查询中的连接表以获取 grails 中的多对多关系

我在 grails 中有 2 个具有多对多关系的域类:套牌和卡片。

设置如下所示:

删除牌组后,我还想删除不再属于牌组的所有牌。完成此操作的最简单方法是编写类似于以下 sql 的内容:

但是,我不知道如何编写将解析为该 SQL 的 HQL 查询,因为连接表 deck_cards 没有相应的 grails 域类。我无法使用普通连接编写此语句,因为 HQL 不允许您在删除语句中使用连接,并且如果我使用子查询来绕过此限制,mySQL 会抱怨,因为不允许您引用您所在的表从子查询的“从”部分中删除。

我还尝试使用休眠“删除-孤儿”级联选项,但这会导致在删除牌组时删除所有牌,即使这些牌也属于其他牌组。我快疯了——这似乎应该是一个简单的任务。

编辑 似乎对“甲板”和“卡片”的这种特定用途有些混淆。在这个应用程序中,“卡片”是抽认卡,一副卡片中可能有数万张。此外,有时需要制作套牌的副本,以便用户可以根据需要对其进行编辑。在这种情况下,新牌组不会复制所有牌,而是只引用与旧牌组相同的牌,如果只有一张牌被更改,就会创建一张新牌。此外,虽然我可以在 groovy 的循环中执行此删除操作,但它会非常缓慢且占用大量资源,因为它会生成数万条 sql 删除语句,而不仅仅是 1 条(使用上面的 sql)。有没有办法访问 HQL 中连接表的属性?

0 投票
1 回答
2060 浏览

grails - removeFrom 正在删除我所有的多对多关联

我正在使用 Grails 1.2 并具有以下多对多关系设置:

我在 Bootstrap.groovy 中播种了一些数据:

这会产生以下数据库数据:

接下来,我尝试从商店中移除一名员工:

这导致所有员工都被解雇。我是否设置了错误的关系或什么?

0 投票
1 回答
305 浏览

hibernate - 直接通过 grails 中的 id 建立关联

我有 2 个具有一对多关系的域对象。举个例子:

在数据库中,post 表有一个名为 author_id 的字段。在我的应用程序中,我有一堆我想与帖子相关联的作者 ID。我可以通过首先查询每个作者的数据库,然后调用 author.addToPosts(post) 来做到这一点。但是,由于我已经有了作者对象的 id,我应该可以直接设置 post.authorId = authorId 来建立关联(这是所有 grails 都会做的)并将所需的查询数量减少一半。

在我正在编写的实际应用程序中,这样做会将我需要进行的查询量减少约 70%。这是应用程序的一个关键瓶颈,我不能承受糟糕的 SQL 性能。我可以很容易地编写一个 sql 语句来做到这一点,但我不知道如何让 grails 让我直接设置 author_id 来手动建立关联。在 Rails 中,这种功能内置于活动记录中。grails有没有办法做到这一点?

0 投票
4 回答
14849 浏览

grails - 如何在 Grails/Groovy 中清除和替换一对多关系中的集合

这个问题分为两部分,第一部分是关于清除列表,第二部分是关于将所有者分配给对象。

我在 Grails 的模型中的两个域对象之间存在一对多的关系。关系看起来是这样的……

在我的应用程序中,locations列表Person完全刷新并替换为用户操作的新列表。更重要的是,我得到了Location独立于关联的对象列表Person。我通过检索当前登录的用户来解决将它们应用到哪个人,我称之为activePerson并且对我的目的来说很好。

我想要做的是删除所有现有位置activePerson并插入所有新位置,将它们与activePerson我去的时候相关联。我有一堆属性Person,此时我不想在这些属性上保留,所以我想避免仅仅因为位置子对象发生变化而保存整个父对象。

我想过遍历activePerson.locations列表并一个一个地删除它们,并依靠 GORM/Hibernate 将查询批处理在一起并在最后刷新。这似乎是蛮力,尽管它可能有效。我期待有一种clearLocations方法或类似的方法,但我找不到。

如果我只是用activePerson.locations新列表替换 并调用activePerson.save(flush:true),GORM 会处理现有行的删除吗?

其次,我想将新Location对象放到activePerson. 我可以再次填充activePerson.locations并保存整个内容,但如果可以的话,我想避免这种情况。我可以单独保存它们,但是我如何belongsTo在每个Location对象上进行设置?

回顾一下:

  1. 如何在一对多集合的多端清除列表?
  2. 如何将独立对象与父对象关联并单独保存它们?

谢谢

0 投票
3 回答
1561 浏览

database - Grails 限制数据库列大小

在我的 Grails 应用程序中,我有一个具有属性的域类

其中 SearchPrivacy 是一个枚举

根据 Grails 文档,映射的数据库列将存储prpu-id属性的值。但是,似乎没有办法减少 DB 列的最大长度。我尝试添加以下两个

但在生成的模式中,该列仍然是varchar(255)

谢谢,唐

0 投票
2 回答
2295 浏览

grails - Grails 全局约束

在 1.2 版中,Grails 引入了全局约束。我尝试将以下内容添加到 Config.groovy

然后在我的一个域类中使用它

但是当我使用空电子邮件地址保存用户时,没有报告错误,为什么?

谢谢,唐