【问题标题】:grails domain without saving itgrails 域而不保存它
【发布时间】:2011-06-27 08:27:45
【问题描述】:

我有:

def userList = [];
if(!User.findAllByGrade(10)){
   userList.add(new User());
}else{ ..... } 


<g:each in="${userList}" var="user"> 
<!-- my big form -->
</g:each>

无论用户是否存在,我都需要显示一个表单......所以我只是将“虚拟”用户添加到列表中。但是会产生错误:

消息:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:用户 原因:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例:用户

我可以用来复制表格,但我只是想知道如何解决这个问题......

【问题讨论】:

  • @nightinagle2k1: 对不起,如果用户不存在,你如何获取 g:each 中的信息?或者您不需要这些信息?
  • 那是准确的代码吗?如果将新的 User 实例附加到已经在 Hibernate 会话中的域对象,通常会出现该错误。上面的代码似乎没有这样做。是 if 还是 else 失败了?
  • 在表单中渲染瞬态对象对我来说很好。看起来您正在尝试保存或 Grails 尝试刷新的其他对象中引用用户。究竟是什么操作给出了错误?代码中的错误到底在哪里?如果是保存动作,你能显示它的代码吗?
  • @nightingale2k1,你有没有想过为什么 grails 试图在这种情况下进行保存?我想我遇到了类似的问题。

标签: java hibernate grails dns grails-orm


【解决方案1】:

if-else 标签库怎么样:

<g:if test="${userList}">
     <!-- Your form for no-user case here. -->
</g:if>
<g:else>
     <!-- Your form for g:each case here. -->
</g:else>

【讨论】:

  • 这是一种不必要的代码重复,至少需要将表单代码移动到单独的模板中。此外,我认为没有理由不让它按建议工作。
  • @Victor:我认为它不会重复,因为似乎在没有用户的情况下,它根本不需要用户信息。不过,等待确认。
  • 它只会在渲染的字段值上有所不同,对吧?渲染一个空域对象也会做同样的事情,而且会渲染默认的用户字段值;如果默认值发生变化,我们将不必更改 GSP。
【解决方案2】:

有点脏,但应该可以:

def userList = [];
if(!User.findAllByGrade(10)){
   userList.add([:]);
}else{ ..... } 

所以不要创建一个新的用户实例,只需将一个空的哈希表添加到列表中;如果结果看起来不太好,你需要做更多的工作:

def userList = [];
if(!User.findAllByGrade(10)){
   userList.add([name:"", age:"", foobar:""]);
}else{ ..... } 

即在哈希表中创建与User 的属性相对应的条目。

【讨论】:

    【解决方案3】:

    如何将null 添加到列表中而不是new User(),然后在gsp 中,使用安全导航运算符.? 引用用户的属性(如user?.name 这样不会抛出NPE)

    所以代码会更像:

    def userList = [];
    if(!User.findAllByGrade(10)){
       userList. << null
    }else{ ..... } 
    
    
    <g:each in="${userList}" var="user"> 
    <!-- my big form -->
        <g:textField name="name" value="${user?.name}" />
    </g:each>
    

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多