Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] OneToMany does not populate Foreign Key or null foreign key

Thank you James,

I did enable FINE logging, there is no previous insert for TestPadre.
Based on your suggestion, I did change the update code to insert TestPadre
first and then try to Merge TestHijo.

These are the sql generated statements

	
INSERT INTO test_padre (nombre, id_empresa, codigo_upc) VALUES (?, ?, ?)
bind => [nombre de Test, se001, 200]
	
INSERT INTO test_hijo (unidad_medida, id_empresa, codigo_sku) VALUES (?, ?,
?) bind => [unidad Medida, se001, 200]

The error

Exception [EclipseLink-4002] (Eclipse Persistence Services -
1.2.0.v20091016-r5565): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: insert or
update on table "test_hijo" violates foreign key constraint "fk_test"
Detail: Key (codigo_upc_hijo,id_empresa)=(,se001) is not present in table
"test_padre". Error Code: 0 Call: INSERT INTO test_hijo (unidad_medida,
id_empresa, codigo_sku) VALUES (?, ?, ?) bind => [unidad Medida, se001, 200]
Query:
InsertObjectQuery(test.TestHijo[testHijoPK=test.TestHijoPK[codigoSku=200,
idEmpresa=se001]]) at 

This is Java Code

    public TestPadre insertTest(TestPadre padre) {

        List<TestHijo> hijos = padre.getTestHijoCollection();
        padre.setTestHijoCollection(null);
        em.persist(padre);
        padre.setTestHijoCollection(hijos);
        for (TestHijo hijo : padre.getTestHijoCollection()) {
            hijo.setTestPadre(padre);
        }
        em.merge(padre);
        return padre;
    }

It looks like EclipseLink is not generating the Foreign Key fields on
TestHijo.

______________________________________________________________________________________






James Sutherland wrote:
> 
> It looks like the TestHijo is being inserted correctly, but the TestPadre
> is not getting inserted first.  Enable logging and see if the insert is
> logged for the TestPadre.
> 
> 
> AntonioJSG wrote:
>> 
>> Hi,
>> 
>> I have a bidirectional oneToMany relationship.
>> TestPadre has many TestHijo.
>> One joinColumn codigo_upc_hijo is not part of the primary key at the
>> owning side of relationship.
>> That joinColumn gets null value when trying to persist.
>> 
>> THIS IS THE DATABASE DEFINITION
>> 
>> CREATE TABLE test_padre
>> (
>>   id_empresa character varying(25) NOT NULL DEFAULT ''::character
>> varying,
>>   codigo_upc character varying(50) NOT NULL DEFAULT ''::character
>> varying,
>>   nombre character varying(300) NOT NULL DEFAULT ''::character varying,
>>   CONSTRAINT key7 PRIMARY KEY (codigo_upc, id_empresa)
>> )
>> 
>> CREATE TABLE test_hijo
>> (
>>   codigo_sku character varying(50) NOT NULL DEFAULT ''::character
>> varying,
>>   id_empresa character varying(25) NOT NULL DEFAULT ''::character
>> varying,
>>   codigo_upc_hijo character varying(50) NOT NULL DEFAULT ''::character
>> varying,
>>   unidad_medida character varying(25) NOT NULL DEFAULT ''::character
>> varying,
>>   CONSTRAINT key8 PRIMARY KEY (id_empresa, codigo_sku),
>>   CONSTRAINT fk_test FOREIGN KEY (codigo_upc_hijo, id_empresa)
>>       REFERENCES test_padre (codigo_upc, id_empresa) MATCH SIMPLE
>>       ON UPDATE RESTRICT ON DELETE RESTRICT
>> )
>> 
>> 
>> THESE ARE THE ENTITY MAPPINGS
>> 
>> public class TestPadre implements Serializable {
>>     private static final long serialVersionUID = 1L;
>>     @EmbeddedId
>>     protected TestPadrePK testPadrePK;
>>     @Basic(optional = false)
>>     @Column(name = "nombre")
>>     private String nombre;
>>     @OneToMany(cascade = CascadeType.ALL, mappedBy = "testPadre", fetch=
>> FetchType.EAGER)
>>     private List<TestHijo> testHijoCollection;
>> (get,set....)
>> 
>> 
>> @Embeddable
>> public class TestPadrePK implements Serializable {
>>     @Basic(optional = false)
>>     @Column(name = "id_empresa")
>>     private String idEmpresa;
>>     @Basic(optional = false)
>>     @Column(name = "codigo_upc")
>>     private String codigoUpc;
>> 
>> 
>> public class TestHijo implements Serializable {
>>     private static final long serialVersionUID = 1L;
>>     @EmbeddedId
>>     protected TestHijoPK testHijoPK;
>>     @Basic(optional = false)
>>     @Column(name = "unidad_medida")
>>     private String unidadMedida;
>>     @JoinColumns({@JoinColumn(name = "codigo_upc_hijo",
>> referencedColumnName = "codigo_upc", nullable=false), @JoinColumn(name =
>> "id_empresa", referencedColumnName = "id_empresa", insertable = false,
>> updatable = false)})
>>     @ManyToOne(optional = false)
>>     private TestPadre testPadre;
>> (get,set...)
>> 
>> 
>> @Embeddable
>> public class TestHijoPK implements Serializable {
>>     @Basic(optional = false)
>>     @Column(name = "codigo_sku")
>>     private String codigoSku;
>>     @Basic(optional = false)
>>     @Column(name = "id_empresa")
>>     private String idEmpresa;
>> 
>> 
>> The data to be persisted is
>> 
>>         TestPadre padre = new TestPadre();
>>         TestPadrePK padrePk = new TestPadrePK("se001", "200");
>>         padre.setTestPadrePK(padrePk);
>>         padre.setNombre("nombre de Test");
>>         padre.setTestHijoCollection(new ArrayList<TestHijo>());
>>         TestHijo hijo = new TestHijo();
>>         TestHijoPK hijoPK = new TestHijoPK("200", "se001", "200");
>>         hijo.setTestHijoPK(hijoPK);
>>         hijo.setUnidadMedida("unidad Medida");
>>         hijo.setTestPadre(padre);
>>         padre.getTestHijoCollection().add(hijo);
>> 
>> 
>> The code to persist is 
>> 
>> public TestPadre insertTest(TestPadre padre) {
>>         for (TestHijo hijo : padre.getTestHijoCollection()) {
>>             hijo.setTestPadre(padre);
>>         }
>>         em.persist(padre);
>>         return padre;
>> }
>> 
>> 
>> When I try to persist TestPadre I get the following error
>> 
>> Exception [EclipseLink-4002] (Eclipse Persistence Services -
>> 1.2.0.v20091016-r5565):
>> org.eclipse.persistence.exceptions.DatabaseException Internal Exception:
>> org.postgresql.util.PSQLException: ERROR: insert or update on table
>> "test_hijo" violates foreign key constraint "fk_test" Detail: Key
>> (codigo_upc_hijo,id_empresa)=(,se001) is not present in table
>> "test_padre". Error Code: 0 Call: INSERT INTO test_hijo (unidad_medida,
>> id_empresa, codigo_sku) VALUES (?, ?, ?) bind => [unidad Medida, se001,
>> 200] Query:
>> InsertObjectQuery(test.TestHijo[testHijoPK=test.TestHijoPK[codigoSku=200,
>> idEmpresa=se001]]) at
>> org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
>> at 
>> .....
>> 
>> What Am I doing wrong ?
>> 
>> thank you
>> 
>> 
>> 
> 
> 

-- 
View this message in context: http://old.nabble.com/OneToMany-does-not-populate-Foreign-Key-or-null-foreign-key-tp27714271p27749580.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top