[ https://issues.apache.org/jira/browse/OPENJPA-171?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stefano Juri updated OPENJPA-171: --------------------------------- Description: I have a simple class system : a PersonImpl owns a set of AbstractAddresses. An AbstractAddress can be an EMailAddressImpl or a PostalAddressImpl. All these objects extend AbstractBusinessObject. When I call entityManager.getReference(PersonImpl.class, "1") I get the EMailAddressImpl object with id "1" instead of a PersonImpl object. If I get the object with a query (select p from PersonImpl p where p.id='1') everything is ok. My mapping file is : <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> <mapped-superclass class="ch.admin.bit.fw2.bm.AbstractBusinessObjectImpl"> <attributes> <id name="id"> <column name="ID" /> <generated-value strategy="SEQUENCE" generator="TimeSeq"/> <sequence-generator name="TimeSeq" sequence-name="time()"/> </id> <version name="version" /> </attributes> </mapped-superclass> <entity class="ch.admin.bit.fw2.demo.bm.address.AbstractAddressImpl"> <table name="ADDRESS"></table> <inheritance strategy="SINGLE_TABLE"/> <discriminator-column name="DISCRIMINANT" length="1"/> <attributes> <basic name="addressName"> <column name="ADDRESS_NAME"/> </basic> </attributes> </entity> <entity class="ch.admin.bit.fw2.demo.bm.address.EMailAddressImpl"> <discriminator-value>E</discriminator-value> <attributes> <basic name="domain"> <column name="EMAIL_DOMAIN"/> </basic> <basic name="name"> <column name="EMAIL_NAME"/> </basic> </attributes> </entity> <entity class="ch.admin.bit.fw2.demo.bm.address.PostalAddressImpl"> <discriminator-value>P</discriminator-value> <attributes> <basic name="firstName"> <column name="FIRST_NAME"/> </basic> <basic name="lastName"> <column name="LAST_NAME"/> </basic> <basic name="street"></basic> <basic name="country"></basic> <basic name="zip"></basic> <basic name="city"></basic> </attributes> </entity> <entity class="ch.admin.bit.fw2.demo.bm.person.PersonImpl"> <table name="PERSON" /> <attributes> <basic name="title" /> <basic name="firstName"> <column name="FIRST_NAME" /> </basic> <basic name="lastName"> <column name="LAST_NAME" /> </basic> <one-to-many name="addresses" target-entity="ch.admin.bit.fw2.demo.bm.address.AbstractAddressImpl"> <join-table name="PERS_ADDR"> <join-column name="ID_PERSON" /> <inverse-join-column name="ID_ADDRESS" /> </join-table> </one-to-many> </attributes> </entity> </entity-mappings> And the database creation script is : -------------------------------------------------- -- Create Table ADDRESS -------------------------------------------------- Create table ADDRESS ( ID VARCHAR(20) NOT NULL , DISCRIMINANT CHARACTER(1) NOT NULL , ADDRESS_NAME VARCHAR(35) NOT NULL , EMAIL_DOMAIN VARCHAR(50) , EMAIL_NAME VARCHAR(50) , FIRST_NAME VARCHAR(35) , LAST_NAME VARCHAR(35) , STREET VARCHAR(35) , CITY VARCHAR(35) , ZIP VARCHAR(10) , COUNTRY CHARACTER(2) , VERSION TIMESTAMP ) ; -------------------------------------------------- -- Create Primary Key PRIMARY_KEY -------------------------------------------------- alter table ADDRESS add constraint PERSON_KEY Primary Key (ID); -------------------------------------------------- -- Create Table PERSON -------------------------------------------------- Create table PERSON ( ID VARCHAR(20) NOT NULL , FIRST_NAME VARCHAR(35) NOT NULL , LAST_NAME VARCHAR(35) NOT NULL , TITLE VARCHAR(35) NOT NULL , VERSION TIMESTAMP ) ; -------------------------------------------------- -- Create Primary Key SQL060816161507820 -------------------------------------------------- alter table PERSON add constraint ADDRESS_KEY Primary Key (ID); -------------------------------------------------- -- Create Table PERS_ADDR -------------------------------------------------- Create table PERS_ADDR ( ID_PERSON VARCHAR(20) NOT NULL , ID_ADDRESS VARCHAR(20) NOT NULL ); -------------------------------------------------- -- Create Primary Key SQL060816161507820 -------------------------------------------------- alter table PERS_ADDR add constraint PERS_ADDR_KEY Primary Key (ID_PERSON,ID_ADDRESS); Insert into PERSON values('1', 'Enrico', 'Barilla', 'Mr',0); Insert into PERSON values('2', 'Adelgrunde', 'Volkswagen', 'Ms',0); Insert into ADDRESS values('1', 'E', 'Home', 'barilla.it', 'enrico.barilla', NULL, NULL, NULL, NULL, NULL, NULL, 0); Insert into ADDRESS values('2', 'P', 'Office', NULL, NULL, NULL, NULL, 'Käferstr. 78', 'Wolfsburg', '12345', 'DE', 0); Insert into ADDRESS values('3', 'P', 'Home', NULL, NULL, NULL, NULL, 'Via delle Lasagne 12', 'Roma', '67890', 'IT', 0); Insert into PERS_ADDR values ('1','1'); Insert into PERS_ADDR values ('1','3'); Insert into PERS_ADDR values ('2','2'); was: I have a simple class system : a PersonImpl owns a set of AbstractAddresses. An AbstractAddress can be an EMailAddressImpl or a PostalAddressImpl. All these objects extend AbstractBusinessObject. When I call entityManager.getReference(PersonImpl.class, "1") I get the EMailAddressImpl object with id "1" instead of a PersonImpl object. If I get the object with a query (select p from PersonImpl p where p.id='1') everything is ok. My mapping file is : <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> <!-- <mapped-superclass class="ch.admin.bit.fw2.bm.AbstractBusinessObjectImpl"> <attributes> <id name="id"> <column name="ID" /> <generated-value strategy="SEQUENCE" generator="TimeSeq"/> <sequence-generator name="TimeSeq" sequence-name="time()"/> </id> <version name="version" /> </attributes> </mapped-superclass> --> <entity class="ch.admin.bit.fw2.demo.bm.address.AbstractAddressImpl"> <table name="ADDRESS"></table> <inheritance strategy="SINGLE_TABLE"/> <discriminator-column name="DISCRIMINANT" length="1"/> <attributes> <basic name="addressName"> <column name="ADDRESS_NAME"/> </basic> </attributes> </entity> <entity class="ch.admin.bit.fw2.demo.bm.address.EMailAddressImpl"> <discriminator-value>E</discriminator-value> <attributes> <basic name="domain"> <column name="EMAIL_DOMAIN"/> </basic> <basic name="name"> <column name="EMAIL_NAME"/> </basic> </attributes> </entity> <entity class="ch.admin.bit.fw2.demo.bm.address.PostalAddressImpl"> <discriminator-value>P</discriminator-value> <attributes> <basic name="firstName"> <column name="FIRST_NAME"/> </basic> <basic name="lastName"> <column name="LAST_NAME"/> </basic> <basic name="street"></basic> <basic name="country"></basic> <basic name="zip"></basic> <basic name="city"></basic> </attributes> </entity> <entity class="ch.admin.bit.fw2.demo.bm.person.PersonImpl"> <table name="PERSON" /> <attributes> <basic name="title" /> <basic name="firstName"> <column name="FIRST_NAME" /> </basic> <basic name="lastName"> <column name="LAST_NAME" /> </basic> <one-to-many name="addresses" target-entity="ch.admin.bit.fw2.demo.bm.address.AbstractAddressImpl"> <join-table name="PERS_ADDR"> <join-column name="ID_PERSON" /> <inverse-join-column name="ID_ADDRESS" /> </join-table> </one-to-many> </attributes> </entity> </entity-mappings> And the database creation script is : -------------------------------------------------- -- Create Table ADDRESS -------------------------------------------------- Create table ADDRESS ( ID VARCHAR(20) NOT NULL , DISCRIMINANT CHARACTER(1) NOT NULL , ADDRESS_NAME VARCHAR(35) NOT NULL , EMAIL_DOMAIN VARCHAR(50) , EMAIL_NAME VARCHAR(50) , FIRST_NAME VARCHAR(35) , LAST_NAME VARCHAR(35) , STREET VARCHAR(35) , CITY VARCHAR(35) , ZIP VARCHAR(10) , COUNTRY CHARACTER(2) , VERSION TIMESTAMP ) ; -------------------------------------------------- -- Create Primary Key PRIMARY_KEY -------------------------------------------------- alter table ADDRESS add constraint PERSON_KEY Primary Key (ID); -------------------------------------------------- -- Create Table PERSON -------------------------------------------------- Create table PERSON ( ID VARCHAR(20) NOT NULL , FIRST_NAME VARCHAR(35) NOT NULL , LAST_NAME VARCHAR(35) NOT NULL , TITLE VARCHAR(35) NOT NULL , VERSION TIMESTAMP ) ; -------------------------------------------------- -- Create Primary Key SQL060816161507820 -------------------------------------------------- alter table PERSON add constraint ADDRESS_KEY Primary Key (ID); -------------------------------------------------- -- Create Table PERS_ADDR -------------------------------------------------- Create table PERS_ADDR ( ID_PERSON VARCHAR(20) NOT NULL , ID_ADDRESS VARCHAR(20) NOT NULL ); -------------------------------------------------- -- Create Primary Key SQL060816161507820 -------------------------------------------------- alter table PERS_ADDR add constraint PERS_ADDR_KEY Primary Key (ID_PERSON,ID_ADDRESS); Insert into PERSON values('1', 'Enrico', 'Barilla', 'Mr',0); Insert into PERSON values('2', 'Adelgrunde', 'Volkswagen', 'Ms',0); Insert into ADDRESS values('1', 'E', 'Home', 'barilla.it', 'enrico.barilla', NULL, NULL, NULL, NULL, NULL, NULL, 0); Insert into ADDRESS values('2', 'P', 'Office', NULL, NULL, NULL, NULL, 'Käferstr. 78', 'Wolfsburg', '12345', 'DE', 0); Insert into ADDRESS values('3', 'P', 'Home', NULL, NULL, NULL, NULL, 'Via delle Lasagne 12', 'Roma', '67890', 'IT', 0); Insert into PERS_ADDR values ('1','1'); Insert into PERS_ADDR values ('1','3'); Insert into PERS_ADDR values ('2','2'); > EntityManager.getReference() returns an object of a wronc class > --------------------------------------------------------------- > > Key: OPENJPA-171 > URL: https://issues.apache.org/jira/browse/OPENJPA-171 > Project: OpenJPA > Issue Type: Bug > Affects Versions: 0.9.6 > Reporter: Stefano Juri > > I have a simple class system : a PersonImpl owns a set of AbstractAddresses. > An AbstractAddress can be an EMailAddressImpl or a PostalAddressImpl. All > these objects extend AbstractBusinessObject. > When I call entityManager.getReference(PersonImpl.class, "1") I get the > EMailAddressImpl object with id "1" instead of a PersonImpl object. > If I get the object with a query (select p from PersonImpl p where p.id='1') > everything is ok. > My mapping file is : > <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm > http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" > version="1.0"> > <mapped-superclass > class="ch.admin.bit.fw2.bm.AbstractBusinessObjectImpl"> > <attributes> > <id name="id"> > <column name="ID" /> > <generated-value strategy="SEQUENCE" > generator="TimeSeq"/> > <sequence-generator name="TimeSeq" > sequence-name="time()"/> > </id> > <version name="version" /> > </attributes> > </mapped-superclass> > > <entity class="ch.admin.bit.fw2.demo.bm.address.AbstractAddressImpl"> > <table name="ADDRESS"></table> > <inheritance strategy="SINGLE_TABLE"/> > <discriminator-column name="DISCRIMINANT" length="1"/> > <attributes> > <basic name="addressName"> > <column name="ADDRESS_NAME"/> > </basic> > </attributes> > </entity> > > <entity class="ch.admin.bit.fw2.demo.bm.address.EMailAddressImpl"> > <discriminator-value>E</discriminator-value> > <attributes> > <basic name="domain"> > <column name="EMAIL_DOMAIN"/> > </basic> > <basic name="name"> > <column name="EMAIL_NAME"/> > </basic> > </attributes> > </entity> > > <entity class="ch.admin.bit.fw2.demo.bm.address.PostalAddressImpl"> > <discriminator-value>P</discriminator-value> > <attributes> > <basic name="firstName"> > <column name="FIRST_NAME"/> > </basic> > <basic name="lastName"> > <column name="LAST_NAME"/> > </basic> > <basic name="street"></basic> > <basic name="country"></basic> > <basic name="zip"></basic> > <basic name="city"></basic> > </attributes> > </entity> > > <entity class="ch.admin.bit.fw2.demo.bm.person.PersonImpl"> > <table name="PERSON" /> > <attributes> > <basic name="title" /> > <basic name="firstName"> > <column name="FIRST_NAME" /> > </basic> > <basic name="lastName"> > <column name="LAST_NAME" /> > </basic> > <one-to-many name="addresses" > > target-entity="ch.admin.bit.fw2.demo.bm.address.AbstractAddressImpl"> > <join-table name="PERS_ADDR"> > <join-column name="ID_PERSON" /> > <inverse-join-column name="ID_ADDRESS" > /> > </join-table> > </one-to-many> > </attributes> > </entity> > > </entity-mappings> > And the database creation script is : > -------------------------------------------------- > -- Create Table ADDRESS > -------------------------------------------------- > Create table ADDRESS ( > ID VARCHAR(20) NOT NULL , > DISCRIMINANT CHARACTER(1) NOT NULL , > ADDRESS_NAME VARCHAR(35) NOT NULL , > EMAIL_DOMAIN VARCHAR(50) , > EMAIL_NAME VARCHAR(50) , > FIRST_NAME VARCHAR(35) , > LAST_NAME VARCHAR(35) , > STREET VARCHAR(35) , > CITY VARCHAR(35) , > ZIP VARCHAR(10) , > COUNTRY CHARACTER(2) , > VERSION TIMESTAMP > ) > ; > -------------------------------------------------- > -- Create Primary Key PRIMARY_KEY > -------------------------------------------------- > alter table ADDRESS > add constraint PERSON_KEY > Primary Key (ID); > -------------------------------------------------- > -- Create Table PERSON > -------------------------------------------------- > Create table PERSON ( > ID VARCHAR(20) NOT NULL , > FIRST_NAME VARCHAR(35) NOT NULL , > LAST_NAME VARCHAR(35) NOT NULL , > TITLE VARCHAR(35) NOT NULL , > VERSION TIMESTAMP > ) > ; > -------------------------------------------------- > -- Create Primary Key SQL060816161507820 > -------------------------------------------------- > alter table PERSON > add constraint ADDRESS_KEY > Primary Key (ID); > > -------------------------------------------------- > -- Create Table PERS_ADDR > -------------------------------------------------- > Create table PERS_ADDR ( > ID_PERSON VARCHAR(20) NOT NULL , > ID_ADDRESS VARCHAR(20) NOT NULL > ); > -------------------------------------------------- > -- Create Primary Key SQL060816161507820 > -------------------------------------------------- > alter table PERS_ADDR > add constraint PERS_ADDR_KEY > Primary Key (ID_PERSON,ID_ADDRESS); > > Insert into PERSON values('1', 'Enrico', 'Barilla', 'Mr',0); > Insert into PERSON values('2', 'Adelgrunde', 'Volkswagen', 'Ms',0); > > Insert into ADDRESS values('1', 'E', 'Home', 'barilla.it', 'enrico.barilla', > NULL, NULL, NULL, NULL, NULL, NULL, 0); > Insert into ADDRESS values('2', 'P', 'Office', NULL, NULL, NULL, NULL, > 'Käferstr. 78', 'Wolfsburg', '12345', 'DE', 0); > Insert into ADDRESS values('3', 'P', 'Home', NULL, NULL, NULL, NULL, 'Via > delle Lasagne 12', 'Roma', '67890', 'IT', 0); > Insert into PERS_ADDR values ('1','1'); > Insert into PERS_ADDR values ('1','3'); > Insert into PERS_ADDR values ('2','2'); -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.