如何将Spring Roo用于引用数据

时间:2015-09-26 05:35:40

标签: spring postgresql jpa spring-roo roo

我是Spring Roo的新手并希望构建一个应用程序。我需要有组合框来选择字符串字段中的值 - 这是一个相当常见的要求。 Spring Roo Pizza示例使用枚举数据类型enum constant显示这一点,但我要求管理员(即在表中)可以编辑源值,以便我们可以在将来更改值。此外,我的偏好是使用单个表来包含所有这些列表,以便于维护。

我知道我想要生成列表的SQL将是:

选择列表来自listTable WHERE listtype =“status”;

然后,我的下拉框会显示如下内容:Active,Inactive。用户将选择一个,并且字符串“Active”将存储在目标字段中。 在第二个例子中,我们可能会使用:

选择列表来自listTable WHERE listtype =“State”;

第二个下拉框将显示如下:阿拉斯加州,加利福尼亚州,佛罗里达州。用户将选择一个,字符串“Florida”将存储在目标字段中。

我的核心问题是如何在Roo中实现这种功能?

使用Pizza Shop快速启动作为沙箱我尝试定义目标字段,例如:

我将field reference --fieldName base --type ~.domain.Base改为:

field reference --fieldName base --type ~.domain.Base --referencedColumnName name

哪个返回了此错误: @JoinColumn name is required if specifying a referencedColumnName

最初的问题是,此时roo尚未为db创建行ID列,因此我不知道Base表上的连接列的名称。但是,如果我等到以1:M连接运行脚本之后,列pizza.base将被定义为整数,而不是我想要的字符串。

所以,我跑了香草披萨店的roo脚本并审问了香草db。 (roo是否为我可以查看的数据库创建生成SQL脚本?) 事实证明,roo将行id列“id”命名为BigInt。 (我还注意到它似乎没有使用postgres建议用于主索引/行ID的SEQUENCE功能。)

所以现在我跑:

field reference --fieldName base --type ~.domain.Base --referencedColumnName name --joinColumnName id

Roo喜欢这个!
在我perform tests之前,它会在Surefire报告中抛出一些难以理解的错误。

我注意到解决这个问题只是满足上述总体要求的第1步。第2步将尝试将某种filter或where子句注入引用语句。我怀疑这与--fetch选项有关(Roo支持文档(http://docs.spring.io/autorepo/docs/spring-roo/1.2.5.RELEASE/reference/html/command-index.html#command-index-finder-commands - JPA级别的获取语义;没有默认值)

但是,我无法找到一个例子,看看我是在正确的轨道上还是模拟我的'fetch语义' - 无论那些是什么。 另一种可能性是使用field list来定义包含我的下拉列表列表的类。这有一个类似的修饰符--fetch,但我再也找不到任何例子。

我真的很感激在回答上面的核心问题时提供了一些帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

Fetch参数指示关联是否应该延迟加载或是否必须急切地获取(https://docs.oracle.com/javaee/6/api/javax/persistence/ManyToOne.html#fetch())。

也许测试的错误可能是因为您尝试使用不存在的相关元素查找,创建,删除或更新元素。首先检查一下。

您可以看到使用gvNIX(Spring Roo的分发)创建的应用程序示例,其中包含https://github.com/DISID/gvnix-samples/blob/master/quickstart-app/quickstart.roo上某些实体之间的关系