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