openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Stefano Juri (JIRA)" <j...@apache.org>
Subject [jira] Updated: (OPENJPA-171) EntityManager.getReference() returns an object of a wronc class
Date Tue, 13 Mar 2007 14:24:09 GMT

     [ 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.


Mime
View raw message