#34177
Javier Ader
Participante

Muy clara no la tengo, pero al llamar al contructo con id 0, el objeto se considera como “nuevo” (PO.m_createNew = true); y al ejecutar el PO.save(), necesariamente va a parar a PO.saveNew(); el cual en las primeras lineas se ve

Code:
// Set ID for single key – Multi-Key values need explicitly be set previously
if (m_IDs.length == 1 && p_info.hasKeyColumn()
&& !m_KeyColumns[0].equals(“AD_Language”))
{
int no = DB.getNextID(getAD_Client_ID(), p_info.getTableName(), m_trxName);
if (no <= 0) { log.severe("No NextID (" + no + ")"); return saveFinish (true, false); } m_IDs[0] = new Integer(no); set_ValueNoCheck(m_KeyColumns[0], m_IDs[0]); }

lo cual termina llamando a set_valueNoCheck con el id calculado automaticamente por DB.getNextId; vos al llamar a mpq.setM_Product_Query_ID haces lo mismo pero ANTES del save (e.d, vos cambias el id de 0 a tu numero; pero despues el saveNew lo pisa).
Para mi, tal vez evitando que se llege al saveNew… una de las formas que veo es (aunque tal vez no muy elegante y no se si no va a tirar algún tipo de error), creas un objeto nuevo (id = 0), lo salvas (eso va a parar a saveNew); lo volves a traer con el id generado automaticamente, se lo cambias con setM_Product_Query_ID al id que vos realmente queres y volves a ejecutar un save(). La teoria es que el ultimo save() no va a llamar a saveNew() , si no a saveUpdate() y tal vez (auqneu tenga bastantes dudas) el codigo de saveUpdate es lo suficientemente general como para permitir updates sobres columnas claves (me da la sensación que si, mirándolo un poco por arriba).

Otra forma que veo es hacer el utlimo update a “mano” (DB.executeUpdate casi seguro que anda), ejecutando algo como
“Update m_ProductQuery set m_productQuery_id =
where m_productQuery_id =
Viejo valor seria el que te dio atuomaticamente el saveNew().
Ok, despues de esto obvimetne tenes que releer el objeto con usadno el constructor con el nuevo id.
OTRA… que no se si va a andar, es NO definir m_productquery_id como Id en la base de datos (tal vez si sea necesario asociarlo al elemento MProductId y como “columana padre”). De esa manera, el saveNew, aun cuando es llamado, no entra dentro del if que genera el id automaticamente (m_IDs.length =0 ).

Más allá de todo esto… estas usando como clave primaria la clave primaria de otra tabla? Es medio raro y problemático; supongo que podes hacer otro diseño que te sirva y no te complique las cosas; pero no se bien cual es la idea (me da la sensación que es una relación 1 a 1-0 entre productos y queries)