没有 Hibernate Session 绑定到线程,并且配置不允许在这里创建非事务性会话

Posted

技术标签:

【中文标题】没有 Hibernate Session 绑定到线程,并且配置不允许在这里创建非事务性会话【英文标题】:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 【发布时间】:2010-02-10 11:22:56 【问题描述】:

在控制器中:

AssocCovList.addAssoc(3, 4)

在域中:

package com.org.domain
class AssocCovList 
    Integer id
    Integer association_id
    Integer cov_list_id
    Date edit_date

    static belongsTo = [association : Association, cov_list : CoverageList]

    static constraints = 
        edit_date(nullable:true )
    

    static mapping = 
        table 'assoc_cov_list'
        version false
        columns 
        id column : 'ASSOC_COV_LIST_ID'
        association_id column : 'ASSOCIATION_ID'
        cov_list_id column : 'COV_LIST_ID'
        edit_date column : 'EDIT_DATE'
        
    


def static addAssoc(3, 4)
   def aclist = new AssocCovList(association_id:3,cov_list_id:4, edit_date:new Date())
   aclist.save()

这里是sql结构:

创建表omni.assoc_cov_list (ASSOC_COV_LIST_ID int(11) NOT NULL auto_increment,ASSOCIATION_ID smallint(6) NOT NULL default '0',COV_LIST_ID int(11) NOT NULL 默认 '0',EDIT_DATE 日期默认 NULL, 主键 (ASSOC_COV_LIST_ID), 唯一键 ASSOC_COV_LIST_I2 (ASSOCIATION_ID,COV_LIST_ID), 键ASSOC_COV_LIST_FK1 (COV_LIST_ID), 键ASSOC_COV_LIST_FK2 (ASSOCIATION_ID) ) ENGINE=InnoDB AUTO_INCREMENT=9584 默认字符集=utf8;

这是返回 No Hibernate Session bound to thread,并且配置不允许在这里创建非事务性会话

为什么它返回空对象? 我能够更新和删除记录。不适用于新记录。

【问题讨论】:

【参考方案1】:

等一下...我认为域类本身不是在其自身上调用 save() 的正确位置! 这应该在控制器或服务级别完成。你能试试这个吗:

在您的域类中:

def static addAssoc(<yourargs>)
    return new AssocList(/*Whatever arguments you pass */)

在您的控制器中:

AssocCovList.addAssoc(<yourargs>).save()    

【讨论】:

您可能需要阅读 groovy.codehaus.org/Groovy+Beans 来了解 Groovy 构造函数的基础知识 好点 ;-) 感谢您让我的大脑焕然一新。我对可空属性的假设是否正确? 大家好,创建不适用于此域,我可以在其他域上创建新记录。您能否再次浏览一下帖子(我编辑了我收到的代码和错误消息)。 @Philippe - 我试过你的例子,但同样的错误发生了。我还可以提供更多代码和 sql 架构。提前致谢 查看我的新答案以获得另一个想法......希望它是正确的,虽然我没有测试它 感谢 Philippe 的输入 - 我刚刚尝试过,但结果相同的错误“没有 Hibernate Session 绑定到线程,并且配置不允许在此处创建非事务性会话” - 我的 id 是自动的递增并且应该动态创建。【参考方案2】:

您将AssocCovList 定义为具有以下属性:

Integer id
Integer association_id
Integer cov_list_id
Date edit_date

然后尝试仅使用association_id 创建new AssocCovList(association_id:3)。但是,默认情况下,所有属性都是 persistent必需。要创建新的AssocCovList,您还需要提供idcov_list_idedit_date

【讨论】:

以上是关于没有 Hibernate Session 绑定到线程,并且配置不允许在这里创建非事务性会话的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate绑定session保证session为单线程操作

Hibernate中Session与本地线程绑定

hibernate之绑定本地session

如何将 Hibernate Session 绑定到 Grails 中的线程?

hibernate 管理 Session(单独使用session,非spring)

Hibernate getCurrentSession()和openSession()的区别