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

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


    
  

Back to the top