- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用 REQUIRES_NEW 注释在服务方法上创建新事务时,会启动一个新的 Hibernate session ,这会导致“非法尝试将集合与两个打开的 session 相关联”错误。只有在保存包含集合的域对象时才会发生此错误。我正在使用 Grails 2.3.11。
域对象:
class MyObject {
String str
Integer value = 1
List container
static hasMany = [container : MyCollection]
}
class MyCollection {
String name
static belongsTo = [obj: MyObject]
}
交易服务:
import grails.transaction.Transactional
import org.springframework.transaction.annotation.Propagation
@Transactional
class MyService {
def getMyObjectById(Long id) {
return MyObject.get(id)
}
def proxyStartStateMachine(MyObject obj) {
doStateMachine(obj)
if (obj.someInteger < 5) {
triggerStateMachineReentry(obj)
} else {
//obj.attach()
//obj.refresh()
obj.discard()
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
def doStateMachine(MyObject obj) {
updateStr(obj, "test${obj.version}")
}
def updateStr(MyObject obj, String str) {
obj.str = str
obj.save() // generates Hibernate error "Illegal attempt to associate a collection with two open sessions"
}
def triggerStateMachineReentry(MyObject obj) {
obj.value++
obj.save()
proxyStartStateMachine(obj)
}
}
Controller 入口点:
class ApiController {
def myService
def index() { }
def stuff(Long id) {
def obj = myService.getMyObjectById(id)
myService.proxyStartStateMachine(obj)
render(status: 200, text: 'OK', contentType: "text/html")
}
}
此服务的预期行为是有 5 个不同的事务,其中 MyObject.value 从 1 更新到 2、2 到 3、3 到 4 和 4 到 5。当集合 MyObject.container 从域中删除时对象,它工作正常。
MySQL 日志:
2302 Query SET autocommit=0
2302 Query update my_object set version=1, str='test0', value=1 where id=1 and version=0
2302 Query commit
2302 Query SET autocommit=1
2302 Query SET autocommit=0
2302 Query update my_object set version=2, str='test1', value=2 where id=1 and version=1
2302 Query commit
2302 Query SET autocommit=1
2302 Query SET autocommit=0
2302 Query update my_object set version=3, str='test2', value=3 where id=1 and version=2
2302 Query commit
2302 Query SET autocommit=1
2302 Query SET autocommit=0
2302 Query update my_object set version=4, str='test3', value=4 where id=1 and version=3
2302 Query commit
2302 Query SET autocommit=1
2302 Query SET autocommit=0
2302 Query update my_object set version=5, str='test4', value=5 where id=1 and version=4
2302 Query commit
2302 Query SET autocommit=1
但是,一旦将集合添加到域对象,在 MyService.updateStr() 中进行第一次保存时,它就会在 MyService 中失败。
我知道这是由于新事务而发生的,但这是此处必需的功能,以确保在状态机的每次迭代期间提交更改并且不会回滚。
最佳答案
我想我已经找到了解决方案。在创建新事务之前,需要使用 object.discard() 从 Hibernate session 中删除该对象。
如果其他人有其他解决方案,请随时提出建议。
关于Grails REQUIRES_NEW 和 "Illegal attempt to associate a collection with two open sessions",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485314/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我有四个模型类: class Group :event_producer end class PersonalBlog :event_producer end class Event true
将应用程序从Rails 4.2.9升级到Rails 5.2.1。 通过大部分令人讨厌的部分,更新了依赖关系和诸如此类的东西,最终使应用程序在console中运行,现在尝试访问server上的页面。加载
我的 EntityDefinition 中有一个关联: ... class ParentEntityDefinition extends EntityDefinition { ...
我不确定为什么这个关联无效 class Tag < ActiveRecord::Base has_and_belongs_to_many :routes end class Route < Act
我有以下关联。 PropertyOwner 是一个连接模型,它属于一个属性(property),多态地属于一个所有者,在下面的例子中是一个 ForeclosureDefense。一切正常,直到我拥有
我有一份有很多发票的工作,一张发票属于一份工作。我想查询第一张发票在某个日期范围内的工作。我有这个查询: @jobs = Job.joins(:invoices). where("invoices
我有这样的关系:用户可以拥有零只或一只狗,但狗必须属于某人。 # dog.rb class Dog { joins(:dog) } # To get records without a dog,
在我的 Rails 4 应用程序中,我有以下模型: User has_many :administrations has_many :calendars, through: :administrati
我见过的所有示例,包括文档都建议按关联过滤应使用以下语法 [contrived exampled] User.findAndCountAll({ include: [ {
我有一个下拉列表(HTML 选择框),它从这个 MySQL 查询中获取值: "SELECT cdID, cdTitle FROM CD ORDER BY cdID" 然后将结果存储在关联数组中,然后将
我是 Ruby ON Rails 新手,我的应用有 3 个模型 class User < ActiveRecord::Base has_one :user_hobby has_one :user_
我有三个模型,每个模型都有以下关联: class Model1 :model1 # will this work? is there any way around this? end class
我有一个带有帖子和标签的数据库。我想找到的帖子,只包含一个标签与一个特定的TagID,根本没有其他标签。下面的代码可以工作,但它需要服务器手动过滤结果,这将使分页变得困难。有谁有可以做到这一点的直接查
任何人都知道如何避免 PLS-00312 错误? “PLS-00312:位置参数关联可能不遵循命名关联” 我得到这个是因为下面一行: AttachList=> v_est_proc_name||'_E
我有以下工厂定义。 Factory.define :status do |f| end Factory.define :my_status , :parent => :status do |f|
我有 2 个具有 1:M 关联的模型,定义如下: var inventory = sequelize.define("Inventory",{**model definition**}; var tr
假设这个模式: var user = sequelize.define('user', { username: Sequelize.STRING, email: Sequelize.S
我正在使用 Apple 的工具进行应用站点关联验证,该工具位于此处:https://search.developer.apple.com/appsearch-validation-tool 它给了我错
实体\识别 /** * @ORM\Entity * @ORM\Table(name="c_rcgntn") */ class Recognition { /** * @ORM\
我是一名优秀的程序员,十分优秀!