1

私のアプリでは、ユーザーが検索を行います。その検索により、職務に雇うことができる人のリストが返されます。ただし、ユーザーは同じ職務に対して複数の検索を行うことができます (たとえば、この都市には 2 人、その都市には 3 人必要です)。検索ごとに「プレプレスプエスト」が作成され、プレプレスプエストごとに「ココントラト」が作成されます。すべての「ココントラート」は「コントラート」になり、すべての「プリプレスプエストス」は単一の「プレスプエスト」になります。そして、アプリ内で「キャンペーン」と呼ばれるすべての義務をまとめて準拠します。

その「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
4

2 に答える 2

2

両方が同じコレクションを参照している場合、複数のエンティティ (cocon) を保存しようとしている可能性があります。あなたが投稿したこのコードでそれを検出するのは難しく、別の場所にある可能性がありますが、これを行うときだと思います:

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

その後、cocon を保存すると、prep と同じコレクションがポイントされます。同じことを言っているこのリンクを見てください。

これを回避する方法は、 を実行して参照を共有する代わりに、コピー先のリストに要素ごとに追加することですa.list = b.list

これもあなたを助けることができます。

于 2012-10-24T14:22:22.973 に答える
0

はい、ティアゴ、コードを少し掘り下げた後(継承されたコードです...)、問題はあなたが言っていることであることがわかりました。私はこれを行うことでそれを解決しました:

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

そして、すべて問題ありませんでした:) ご回答ありがとうございます。

于 2012-10-25T07:15:43.390 に答える