[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| 
Re: [eclipselink-users] @Embeddable and @mapsId
 | 
Hello,
I'm not sure what to say, as the error is clear that the problem is it 
is trying to insert a value of 10005699 into B's id attribute - which is 
set to be a type of APK. 
Are you sure you have this set up correctly?  You are posting the BPK 
class when both A and B are now using APK, does the APK class look like 
the BPK? 
Maybe file a bug with a reproducible test case, as it is very difficult 
to determine what is going wrong with partial snippets, where anything 
excluded might be a factor
in your issue.  The test code provided does work though; it was pulled 
from EclipseLink's regression tests found within the model at:
http://fisheye2.atlassian.com/browse/eclipselink/trunk/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/models/jpa/advanced/derivedid
Best Regards,
Chris
luke2010 wrote:
Chris, thanks for your solution. I followed it, and type the snippet below:
=======
@Entity 
    public class A { 
       @EmbeddedId APK id; 
        ... 
      @OneToOne(optional=false, mappedBy="a", cascade = ALL, targetEntity =
B.class) 
      @PrivateOwned 
      private B b; 
       ... 
    } 
    @Entity 
    public class B { 
       @EmbeddedId APK id; 
        ... 
                
        
       @OneToOne(optional = false) 
        @JoinColumns({ 
                @JoinColumn(name="A_ID", referencedColumnName="A_ID"), 
                @JoinColumn(name="B_ID", referencedColumnName="B_ID"), 
                }) 
                @MapsId
                private A a; 
    } 
  
  
  @Embeddable 
    public class BPK { 
                @Column(name="A_ID") 
       int aId name; 
            
           @Column(name="B_ID") 
       long bId; 
    } 
===============================
I tried @MapsId or @MapsId("id"), either of them works for me. and here is
the error message I got 
----------------
Thread(Thread[Main Thread,5,main])--Exception [EclipseLink-32] (Eclipse
Persistence Services - 2.0.1.v20100213-r6600):
org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Trying to set value [10005699] for instance variable
[id] of type [com.entities.copy.APK] in the object.  The specified object is
not an instance of the class or interface declaring the underlying field, or
an unwrapping conversion has failed.
Internal Exception: java.lang.IllegalArgumentException: Can not set
com.entities.copy.APK field com.entities.copy.B.id to java.lang.String
Mapping: org.eclipse.persistence.mappings.AggregateObjectMapping[id]
===================================
luke2010 wrote:
  
here is one scenario
there are two entity A, B, A has PK class APK including aId, bId, B has
BPK class including aId, bId as well. they have oneToone relationship. Can
I use annotation @MapsId on @OnetoOne relationship on entity B? 
==========================
    @Entity
    public class A {
       @EmbeddedId APK id;
        ...
		
       
      @OneToOne(optional=false, mappedBy="a", cascade = ALL, targetEntity
= B.class)
      @PrivateOwned
      private B b;
       ...
    } 
    @Entity
    public class B {
       @EmbeddedId BPK id;
        ...
		
       
       @OneToOne(optional = false)
	@JoinColumns({
		@JoinColumn(name="A_ID", referencedColumnName="A_ID"),
		@JoinColumn(name="B_ID", referencedColumnName="B_ID"),
		})
		@MapsId ??????
		private A a;
    }
 
 
  @Embeddable
    public class BPK {
		@Column(name="A_ID")
       int aId name;
	   
	   @Column(name="B_ID")
       long bId; 
    }
======================================
I tried @MapsId at the question mark location, but I don't know which
attribute name to provide. If i dont' provide anything, i got error below: 
---------------------------------
Caused by: Exception [EclipseLink-7316] (Eclipse Persistence Services -
2.0.1.v20100213-r6600):
org.eclipse.persistence.exceptions.ValidationException
Exception Description: The mapped by id value [a] from the mapping
attribute [field a] is invalid. An equivalent attribute with that name
must be defined on the id class [class com.package.BPK]