在我的应用中,用户进行搜索。该搜索返回了可以被雇用的人员名单。但是,用户可以为同一个职责进行多次搜索(例如,我需要这个城市的两个人,以及该城市的三个人)。每次搜索都会产生“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
答案 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])
}
一切都很好:)谢谢你的回答。