在Grails中找到了对集合的共享引用

时间:2012-10-24 10:50:18

标签: grails

在我的应用中,用户进行搜索。该搜索返回了可以被雇用的人员名单。但是,用户可以为同一个职责进行多次搜索(例如,我需要这个城市的两个人,以及该城市的三个人)。每次搜索都会产生“Prepresupuesto”,而每个Prepresupue都会制作一个“Cocontrato”。所有“Cocontrato”都制作了一个“Contrato”,所有“Prepresupuestos”都制作了一个“Presupuesto”。所有这些都符合整个职责,在应用程序中称为“广告系列”。

当我试图保存“Cocontrato”时,我收到了例外。这是代码:

ArrayList<Prepresupuesto> prepresus=Prepresupuesto.findAllByCamp(campid)

        Presupuesto pres=new Presupuesto()

        for(int i=0;i<prepresus.size();i++){

            pres.prepresu.add(prepresus[i])

            pres.camp=Campaign.get(prepres.camp.id)

            pres.estado="Pending"

            total=total+prepresus[i].total

            crearCocontrato(prepresus[i])
            }

方法crearCocontrato():

public crearCocontrato(Prepresupuesto prep){
    Set <Azafata>azas=prep.azafatas
    Cocontrato cocon=new Cocontrato()
    cocon.contrato=con
    cocon.precio=prep.precio
    cocon.azafatas=azas
    cocon.total=prep.total
    cocon.horas=prep.horas
    cocon.horario=prep.horario
    cocon.localidad=prep.localidad
    cocon.fechaInicio=prep.fechaInicio
    cocon.fechaFin=prep.fechaFin
    cocon.presu=prep
    cocon.camp=prep.camp



    if(!(cocon.save(flush:true))){
        render (view:"fallos", model:[azafataInstance:cocon])

    }
}

异常在if中启动。

有任何帮助吗?我有点失落,我是Grails的新手,我想我完全不理解这个例外。

谢谢!

编辑:例外:

Found shared references to a collection: com.publidirecta.Cocontrato.azafatas.     Stacktrace follows:
Message: Found shared references to a collection: com.publidirecta.Cocontrato.azafatas
Line | Method
->> 2448 | crearCocontrato in com.publidirecta.EntidadController$$ENmku0D2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   2394 | boton           in     ''
|    886 | runTask . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
|    908 | run             in     ''
^    680 | run . . . . . . in java.lang.Thread

2 个答案:

答案 0 :(得分:2)

当两者都引用同一个集合时,您可能会尝试保存多个实体(cocon)。在你发布的这段代码中很难发现它可能在其他地方,但我会说这是你做的时候:

Set <Azafata>azas=prep.azafatas
cocon.presu=prep

然后当你保存cocon时,它指向与prep相同的集合。看看这个link,说同样的事情。

解决这个问题的方法是将元素逐个元素添加到要复制到的列表中,而不是通过执行a.list = b.list来共享引用。

This也可以帮到你。

答案 1 :(得分:0)

是的,Tiago,在代码中潜水了一下(它是继承的代码......)我发现问题就是你说的。我解决了这个问题:

ArrayList <Azafata> azas=new ArrayList<Azafata>()
    for(int i=0;i<prep.azafatas.size(); i++){
        azas.add(prep.azafatas.toArray()[i])
} 

一切都很好:)谢谢你的回答。