从 Grails 应用程序外部插入数据时,Grails 如何设置 _idx 字段?

Posted

技术标签:

【中文标题】从 Grails 应用程序外部插入数据时,Grails 如何设置 _idx 字段?【英文标题】:Grails how to set _idx field when INSERTing data from outside of the Grails application? 【发布时间】:2013-02-02 07:53:13 【问题描述】:

我有一个带有两个域的脚手架 Grails 应用程序,即 Person 和 Course。 Person 属于 Course,Course 有很多 Person。我已经修改了课程的 show.gsp 以列出与所选课程相关的所有人员。

为此,Course.groovy 包含以下行:

List persons = new ArrayList()

因此,“person”数据库表包含一个persons_idx 字段。我经常会从外部网站向我的 Grails 应用程序外部的“person”表添加新数据。

在插入新数据时,如何确定将 person_idx 设置为什么?

我最初使用 SortedSet 而不是 ArrayList 来表示人员,因为我关心排序。但是由于我是按 Person.lastName 排序的,并且总会有多个姓氏相同的人,因此该列表将排除那些与其他人姓氏相同的人。我希望有另一种方式...

谢谢。

【问题讨论】:

【参考方案1】:

尽可能避免让两个应用程序操作同一个数据库。您的第二个应用程序能否改为在控制应用程序上调用一个操作以将一个人添加到课程中,并传递参数来指定每个人?这样一来,只有一个应用程序正在写入数据库,从而减少了缓存、索引和序列问题。

您还声明 Person 属于 Course...所以您为“Bob Jenkins”为他所在的每个课程创建一个新 Person?这似乎太过分了。您可能应该为此研究 ManyToMany。

不幸的是,如果不迁移到服务,您可能希望更改要添加 Person 的 Course 子项的某些行的索引,因为该索引是排序索引对于课程中的所有人员。

我建议回到“Set”,然后在应用程序中进行排序。您关于排序的其他问题已经告诉您不要覆盖 compareTo 来检查姓氏。如果我是你,我会完全忘记覆盖 compareTo(如果你愿意,除了检查 ID),只使用 sort() 方法,传入一个正确排序对象的闭包。

【讨论】:

最终,是的,我确实需要引入一个服务层,我的每个应用程序都可以使用它来与数据库通信。我只是还没有。我会探索多对多,但根据我的要求,“Bob Jenkins”只能注册一门课程。 “还没有”与 Grails 相去甚远。本质上,大多数控制器已经“几乎”是 RESTful 服务。困难的部分是让您的其他应用程序能够使用 HttpClient 或其他方式使用参数访问您的 Grails 应用程序,而不是直接访问数据库。 我编辑了一点来解决您当前的问题,而不是遥远的东西。 谢谢。您对以下文章中的解决方案有何看法...(burtbeckwith.com/blog/?p=1029)?它建议不要使用课程中的人员集合,而是将“课程课程”添加到人员。我发现这对我有用,虽然我还不能完全理解它为什么有效,确切地说。通过这个解决方案,我可以在 show.gsp 页面中实现排序。 当然,伯特是个聪明人。那时你基本上是在编写自己的 oneToMany,但这并不难。您可以编写自己的级联删除等代码。

以上是关于从 Grails 应用程序外部插入数据时,Grails 如何设置 _idx 字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用hibernate grails 3,mysql?

如何从 grails 3.1.8 中的外部文件加载数据源配置?

在 Grails 中存储和编辑键/值对?

如何从grails 3.1.8中的外部文件加载数据源配置?

Grails,使用 withTransaction 插入大量数据会导致 OutOfMemoryError

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