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 Chris,

It is working fine, due to lazy loading the foreign entity was showing null
on debug. But returning entity on getter method.
 
Thanks.
Kiran


christopher delahunt wrote:
> 
> Hello Kiran,
> 
> How are you getting/creating the target entity to associate to the 
> source?  Does the source entity have the foreign key and type populated 
> correctly in the database?
> If the target entity is not managed (ie read/persisted/merged into the 
> EntityManager) when it is associated to the source entity, then the 
> source entity has nothing to reference when it is put into the shared 
> cache and could
> explain why it is null when you get it later on  - although I would have 
> expected an exception to occur.  Does the same thing occur if you use a 
> OneToOne mapping?
> 
> Regards,
> Chris
> 
> On 01/12/2010 6:47 AM, Kiran Kumar Gubbi wrote:
>> Hi Chris,
>>
>> I am able to persists the SourceEntity with no CacadeType and
>> PrivateOwned
>> annotation as this was trying to insert Target table that I don't want.
>> Now
>> I am having trouble while fetching the SourceEntity. The SourceEntity is
>> having null value for foreignEnity. 
>>
>>
>> Thanks,
>> Kiran
>>
>>
>> Kiran Kumar Gubbi wrote:
>>   
>>> Hi Chris,
>>>
>>> Thanks for your help. The issue was columnDefinition of the
>>> discriminatorColumn. I changed that to 'name', now it is fine. I have
>>> the
>>> same issue which James has explained. I am using two separate attributes
>>> one for FORIEGN_ID and other one for FOREING_CLASS_TYPE both insertable
>>> +
>>> updatable set to false. I hope there won't be any further issue on this.
>>>
>>> Thanks,
>>> Kiran
>>>
>>>
>>>
>>>
>>> christopher delahunt wrote:
>>>     
>>>> Hello Kiran,
>>>>
>>>> Only potential problems I can see in your mapping is that the spelling 
>>>> of foreign is different in your join column from everywhere else.
>>>>
>>>> The exception implies you are trying to execute a query - are there any 
>>>> problems persisting or reading in entities?  If the only problem you 
>>>> have is queries, the exception states queries over over
>>>> VariableOneToOne 
>>>> mappings are not supported.  James answers a similar question in the 
>>>> Eclipselink forum at:
>>>> http://www.eclipse.org/forums/index.php?t=msg&goto=537838&#msg_537838
>>>>
>>>>
>>>> Regards,
>>>> Chris
>>>>
>>>> On 30/11/2010 10:48 AM, Kiran Kumar Gubbi wrote:
>>>>       
>>>>> 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
>>>>>>
>>>>>>
>>>>>>     
>>>>>>           
>>>>>   
>>>>>         
>>>> _______________________________________________
>>>> 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-tp30308910p30349232.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top