没有 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
,您还需要提供id
、cov_list_id
和edit_date
。
【讨论】:
以上是关于没有 Hibernate Session 绑定到线程,并且配置不允许在这里创建非事务性会话的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate绑定session保证session为单线程操作
如何将 Hibernate Session 绑定到 Grails 中的线程?