Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Exception on using VariableOneToOneannotation

Hi Chirs,
I have changed my code to use @VariableOneToOne annotation instead of
Customizer. But I am getting the following exception.

'Mapping:
[org.eclipse.persistence.mappings.VariableOneToOneMapping[foreignEntity]]
	at
org.eclipse.persistence.exceptions.QueryException.cannotQueryAcrossAVariableOneToOneMapping(QueryException.java:405)'

My annotation details are 

       @VariableOneToOne( targetInterface = EntityInterface.class,
			discriminatorColumn =
				@DiscriminatorColumn(
						columnDefinition = "FOREING_CLASS_TYPE",
						discriminatorType = DiscriminatorType.STRING ),
	        discriminatorClasses = {
        		@DiscriminatorClass( discriminator = "TargetTable1", value =
TargetTable1.class ),
        		@DiscriminatorClass( discriminator = "TargetTable2", value =
TargetTable2.class )
           },
           fetch = FetchType.LAZY
	)
	@JoinColumn( name = "FORIENG_ID", referencedColumnName = "id" )
	@PrivateOwned
	private EntityInterface foreignEntity;

I hope there might be some error in my annotation.

Thanks,
Kiran



christopher delahunt wrote:
> 
> Hello Kiran,
> 
> You have the foreignEntity attribute mapped twice; once when you add 
> the  @VariableOneToOne() annotation, and the second is when you add the 
> customizer code to create the new VariableOneToOneMapping. 
> Since the annotation has nothing defined, it will use the default fields 
> - FOREIGNENTITY_ID for the foreign key, and DTYPE for the type field. 
> 
> Map the column entirely through annotations, or look up the mapping on 
> the descriptor in the customizer instead of creating a new one.  ie 
> descriptor.getMapping("foreignEntity")
> 
> Regards,
> Chris
> 
> 
> 
> 
> 
> 
> 
> On 29/11/2010 5:11 AM, Kiran Kumar Gubbi wrote:
>> Hi Chris,
>>
>> After correcting the customizer I am not getting exception on server
>> start
>> up. But while on page loading I am getting ' java.sql.SQLException:
>> ORA-00904: "T1"."DTYPE": invalid identifier ' exception. My source class
>> is
>> having the foreignClassType and foreignId which are set insertable +
>> updatable as 'false'  (This fields are very much required as our JPQL
>> uses
>> this fields in where clause). But when I see in the server log it seems
>> the
>> sql is having two new column t1.FOREIGNENTITY_ID , t1.DTYPE  which I have
>> not defined in my entity. 
>>
>> To make further clear I am giving my lates entity and customizer details
>>
>>  @Entity
>>  @Table( name = "SourceTable" )
>>  @Customizer( SourceCustomizer.class )
>>  public class SourceTable 
>>  {
>>
>> @Column( name = "SOURCE_ID", nullable = false, unique = true )
>> private Integer id;
>>
>>  @VariableOneToOne()
>>  private EntityInterface foreignEntity;
>>
>>  @Column( name = "FORIENG_ID", nullable = false, insertable = false,
>> updatable = false  )
>>  private Integer foreignId;
>>
>>  @Column( name = "FOREING_CLASS_TYPE", nullable = false, insertable =
>> false,
>> updatable = false )
>>  private String foreignClassType;
>>
>> // atttribute setter and getter method 	
>> 	
>>  }
>>  
>>  My DescriptorCustomizer detail is 
>>
>>  public class SourceCustomizer implements DescriptorCustomizer {
>>          public void customize( final ClassDescriptor descriptor ) 	{
>> 			VariableOneToOneMapping variableOneToOneMapping = new 
>> VariableOneToOneMapping();
>> 			variableOneToOneMapping.setAttributeName( "foreignEntity" );
>> 			variableOneToOneMapping.setReferenceClass( EntityInterface.class );
>> 			variableOneToOneMapping.setForeignQueryKeyName(
>> "SourceTable.FORIENG_ID",
>> "id" );
>> 			variableOneToOneMapping.setTypeFieldName(
>> "SourceTable.FOREING_CLASS_TYPE" );
>> 			// configure class indicators
>> 			variableOneToOneMapping.addClassIndicator( TargetTable1.class,
>> "TargetTable1" );
>> 			variableOneToOneMapping.addClassIndicator(
>> TargetTable2.class,"TargetTable2" );
>> 			variableOneToOneMapping.dontUseIndirection();
>> 			variableOneToOneMapping.privateOwnedRelationship();
>>
>> 			// add mapping to descriptor
>> 			descriptor.addMapping( variableOneToOneMapping );
>>  	}
>>  }
>>
>> Any suggestion is very helpfull. 
>>
>> Thanks,
>> Kiran
>>
>>
>>
>> christopher delahunt wrote:
>>   
>>> yes, that was only part of the problem.  The other part is you are using 
>>> the setForeignQueryKeyName incorrectly. 
>>> The method signature is addForeignQueryKeyName(String 
>>> sourceForeignKeyFieldName, String targetQueryKeyName)
>>> where as you are passing in two fields - the second parameter should be 
>>> a query key, not a database field.  It should look something like:
>>>   variableOneToOneMapping.setForeignQueryKeyName( 
>>> "SourceTable.FORIENG_ID", "queryKeyName");
>>>
>>> The "queryKeyName" must be a query key  in the target variable 
>>> descriptor that will be mapped to the primary key in the hard 
>>> implementation descriptors.
>>> So it will need to be mapped to "TargetTable1.T1_ID" and 
>>> "TargetTable2.T2_ID" depending on the concrete class the discriminator 
>>> indicates. 
>>>
>>> Variable mappings are described at:
>>> http://wiki.eclipse.org/Configuring_a_Relational_Variable_One-to-One_Mapping_(ELUG)
>>>
>>> Best Regards,
>>> Chris
>>>
>>> On 26/11/2010 9:47 AM, Kiran Kumar wrote:
>>>     
>>>> Hello Chris,
>>>>
>>>> Even after removing 'foreignId' attribute from the 'SourceEntity' still
>>>> getting the exception saying 'Only one may be defined as writable, all
>>>> others must be specified read-only'. I have a doubt is it because of
>>>> 'setForeignQueryKeyName' in SourceCustomizer class using twice to set
>>>> the foreign_id to the primary key of TargetTable1 and TargetTable2.
>>>>
>>>> Thanks,
>>>> Kiran
>>>>
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: eclipselink-users-bounces@xxxxxxxxxxx
>>>> [mailto:eclipselink-users-bounces@xxxxxxxxxxx] On Behalf Of Christopher
>>>> Delahunt
>>>> Sent: 26 November 2010 13:19
>>>> To: EclipseLink User Discussions
>>>> Subject: Re: [eclipselink-users] Exception on using
>>>> VariableOneToOneannotation
>>>>
>>>> Hello Kiran,
>>>>
>>>> Yes, as the exception states, you have the "SourceTable.FORIENG_ID" 
>>>> mapped twice - the first being the foreignId mapping, and the second in 
>>>> the foreignEntity mapping.
>>>> Only 1 can be writable; the others need to be set to read-only (or 
>>>> insertable+updatable =false ).  Otherwise, should they ever be set 
>>>> differently, there is no way to tell which one
>>>> should be written to the database.
>>>>
>>>> Best Regards,
>>>> Chris
>>>>
>>>>
>>>>
>>>> On 26/11/2010 5:17 AM, Kiran Kumar Gubbi wrote:
>>>>   
>>>>       
>>>>> Hi,
>>>>>
>>>>> While on start of the application server I am getting the eclispe link
>>>>> exception saying 'Only one may be defined as writable, all others must
>>>>>     
>>>>>         
>>>> be
>>>>   
>>>>       
>>>>> specified read-only.'. My table and the code detail is given below.
>>>>>
>>>>> SourceTable - ID, FOREING_CLASS_TYPE , FORIENG_ID
>>>>>
>>>>> TargetTable1 - T1_ID
>>>>> TargetTable2 - T2_ID
>>>>>
>>>>> The source table FORIENG_ID is foreing key to TagergetTable1.T1_ID and
>>>>>     
>>>>>         
>>>>   
>>>>       
>>>>> TargetTable2.T2_ID.
>>>>>
>>>>>
>>>>> My DescriptorCustomizer detail is 
>>>>>
>>>>> public class SourceCustomizer implements DescriptorCustomizer
>>>>> {
>>>>>         public void customize( final ClassDescriptor descriptor )
>>>>> 	{
>>>>> 	    VariableOneToOneMapping variableOneToOneMapping = new
>>>>> VariableOneToOneMapping();
>>>>> 	    variableOneToOneMapping.setAttributeName( "foreignEntity" );
>>>>> 	    variableOneToOneMapping.setReferenceClass(
>>>>>     
>>>>>         
>>>> EntityInterface.class );
>>>>   
>>>>       
>>>>> 	    variableOneToOneMapping.setForeignQueryKeyName(
>>>>> 	    		"SourceTable.FORIENG_ID", "TargetTable1.T1_ID"
>>>>>     
>>>>>         
>>>> );
>>>>   
>>>>       
>>>>> 	    variableOneToOneMapping.setForeignQueryKeyName(
>>>>> 	    		"SourceTable.FORIENG_ID", "TargetTable2.T2_ID"
>>>>>     
>>>>>         
>>>> );
>>>>   
>>>>       
>>>>> 	    variableOneToOneMapping.setTypeFieldName( "SourceTable
>>>>> .FOREING_CLASS_TYPE" );
>>>>>
>>>>> 	    // configure class indicators
>>>>> 	    variableOneToOneMapping.addClassIndicator(
>>>>>     
>>>>>         
>>>> TargetTable1.class,
>>>>   
>>>>       
>>>>> "TargetTable1" );
>>>>> 	    variableOneToOneMapping.addClassIndicator( TargetTable2
>>>>>     
>>>>>         
>>>> .class,
>>>>   
>>>>       
>>>>> "TargetTable2" );
>>>>>
>>>>> 	    variableOneToOneMapping.dontUseIndirection();
>>>>> 	    variableOneToOneMapping.privateOwnedRelationship();
>>>>>
>>>>> 	    // add mapping to descriptor
>>>>> 	    descriptor.addMapping( variableOneToOneMapping );
>>>>> 	}
>>>>> }
>>>>>
>>>>> My entity has the VariableOntoOne mapping like the one mention below.
>>>>>
>>>>>
>>>>> @Entity
>>>>> @Table( name = "SourceTable" )
>>>>> @Customizer( SourceCustomizer.class )
>>>>> public class SourceTable 
>>>>> {
>>>>>
>>>>> @VariableOneToOne()
>>>>> private EntityInterface foreignEntity;
>>>>>
>>>>> @Column( name = "FORIENG_ID", nullable = false )
>>>>> private Integer foreignId;
>>>>>
>>>>> }
>>>>>
>>>>> is there anything I am missing in this ?
>>>>>
>>>>> Thanks,
>>>>> Kiran
>>>>>  
>>>>>   
>>>>>     
>>>>>         
>>>> _______________________________________________
>>>> eclipselink-users mailing list
>>>> eclipselink-users@xxxxxxxxxxx
>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>>   
>>>>       
>>> _______________________________________________
>>> eclipselink-users mailing list
>>> eclipselink-users@xxxxxxxxxxx
>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>
>>>
>>>     
>>
>>   
> 
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> 
> 

-- 
View this message in context: http://old.nabble.com/Exception-on-using-VariableOneToOne-annotation-tp30308910p30340798.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top