Alvin, OK then here is the thing:
When you use EJB relationships, you don't have to think only relational database but also Object Oriented database. I mean you don't have to store in an entityA field the PK of entityB but rather say to the system, (in this case the EJB container) my entityA instance is linked to this instance of entity B and the system (OO DB or the container is taking care of the persistency of that specific instances' relation). For example: EntityA represents BANK's users (PK= String userID + String bankID) EntityB represents BANKs (PK= String bankID). A Bank may have several users within the bank. Suppose you want to create a EJB relationship between users and banks. So you create a CMR field in EntityA called rBank. This relationship needs to be persisted so you specify in the deployment descriptor that the relationship is related to the table Users, column field bankID (which is, from a relational DB point of vue, a FOREIGN KEY). You need to "tell" the container how it should persist the relationship. The DD is there for that. Of course you have that column represented in the entityA as a CMP field (bankID) so you may (NOT AN OBLIGATION) have defined (your IDE may have done that for you automatically) a SET method for that CMP field. In EntityB you have a CMR field called rUsers for which the getRUsers method return a Collection of EntityA instances. Again here, that CMR is linked to the CMP field bankID in the table BANK for persistency purposes. Note: CMR fields like CMP fields can have getters and setters. Now, you want to create a new user. >From the EntityA home interface you use the create method which will return you a new EntityA instance. Within the ejbCreate method of EntityA you may initialise the relationship with a bank's instance. You can't use the setBankID of EntityA (THAT's THE RULE in the SPEC) but you need to ge the bank's instance (findByPK) and apply the method: instanceB.getRUsers().add(this). Of course I do not recommend to do that there.. But rather in a SessionBean. So in the session bean: EntityA entityA = null; EntityB entityB = null; Try { entityA = entityAHome.create(new PK); entityA.setXXX(...) for CMP fields not being part in a relation (you can do the setter in the ejbCreate method). entityA.setBankID(bankID); /// THIS WILL CAUSE AN EXCEPTION entityB = entityBHome.findByPK(bankID); entityB.getRUsers().add(entityA); //here the container will update CMP field bankID in entityA with the right info based on the info provided in the deployment descriptor). } Note: I'd recommend you not to provide any setters for CMP-CMR fields to avoid any tentation!! Note: in the case of a N-M table relationship, you need to have a intermediate table (typical database technique) and CMR fields in entnityA/B needs to be "physically" linked (in the DD) to that intermediary table. Daniel -----Original Message----- From: Alvin Wang [mailto:[EMAIL PROTECTED]] Sent: lundi 11 mars 2002 16:14 To: Daniel De Luca; [EMAIL PROTECTED] Subject: RE: An CMR related exception Daniel, I feel that my problem is not initializing a PK, but any field that is mapped to a CMR. Again, the exception is as below: "javax.ejb.EJBException: When a cmp-field and a cmr-field (relationship) are mapped to the same column, the setXXX method for the cmp-field may not be called. The cmp-field is read-only." Yeah, the XXX happens to be a foreign key in my case -----Original Message----- From: A mailing list for Enterprise JavaBeans development [mailto:[EMAIL PROTECTED]]On Behalf Of Daniel De Luca Sent: Monday, March 11, 2002 9:52 AM To: [EMAIL PROTECTED] Subject: Re: An CMR related exception Alvin Yes entityA is an existing instance which has a PK. It won't be possible for you to use your PK in a relationship between entities. If your instanceA PK and instanceB PK are used for the relationship between each other, you need to change the PK of the corresponding entities to make them relationship independent. This mean, create a new CMP field in both entities that will be used as PK. Then use the old PKs as "normal" fields (non used as PK) in order to be able to used them as CMR and without being forced to initialize them in the ejbCreate method. If this is not giving you a solution to your problem, could you send the code of your entities (puttin in comment which are the field that are used in your relationship and which one are PKs). Hope this help Daniel -----Original Message----- From: Alvin Wang [mailto:[EMAIL PROTECTED]] Sent: lundi 11 mars 2002 15:44 To: Daniel De Luca; [EMAIL PROTECTED] Cc: [EMAIL PROTECTED] Subject: RE: An CMR related exception Daniel, I read the section you pointed out. I did not find either how it is related to my problem and how your solution solves my problem. in "entityBRef.getREntityA().add(entityARef)", is entityARef an existing Bean A instance initialized with PK? Then when/how did that XXX field INITIALIZED? I'm a little slow. Please give me details. Thanks! -----Original Message----- From: Daniel De Luca [mailto:[EMAIL PROTECTED]] Sent: Monday, March 11, 2002 4:08 AM To: [EMAIL PROTECTED] Subject: RE: An CMR related exception Alvin, Yes that's right. Why? Well that's how the specs are defined and how the App Server container have to do things. Check the EJB 2.0 specs for more details: 10.3.8 Collections managed by the Container, 10.3.6 Semantics of assignment for relationships Daniel -----Original Message----- From: Alvin Wang [mailto:[EMAIL PROTECTED]] Sent: samedi 9 mars 2002 2:23 To: Daniel De Luca; [EMAIL PROTECTED] Subject: RE: An CMR related exception Deniel, thanks for replying. Do you mean "entityBRef.getREntityA().add(entityARef)" will initialize that field? Why? Or when and how that field will be initialized in later time? Please give more details! Thanks! -----Original Message----- From: A mailing list for Enterprise JavaBeans development [mailto:[EMAIL PROTECTED]]On Behalf Of Daniel De Luca Sent: Friday, March 08, 2002 11:58 AM To: [EMAIL PROTECTED] Subject: Re: An CMR related exception Alvin, You can't apply a Set method on a cmp-field that is used in a relationship between 2 entities. You don't necessarily need to initialize that field in the ejbCreate method. What you have to do is create the Entity bean and initialize only the PK. Then suppose EntityA has a relation with EntityB and the CMR fields are rEntityB (in EntityA) and rEntityA (in EntityB) In order to "set" the relationship between the 2 you need to use the entityBRef.getREntityA().add(entityARef). After that your CMP-field will be up to date. I would suggest you to read the EJB 2.0 Spec, everything is explained there. Hope this help. Daniel -----Original Message----- From: A mailing list for Enterprise JavaBeans development [mailto:[EMAIL PROTECTED]] On Behalf Of Alvin Wang Sent: vendredi 8 mars 2002 16:12 To: [EMAIL PROTECTED] Subject: An CMR related exception Hi! I am using Weblogic 6.1 SP2 and EJB 2.0. I built a CMR between two Entity Beans. However, I got the following exception while running: "javax.ejb.EJBException: When a cmp-field and a cmr-field (relationship) are mapped to the same column, the setXXX method for the cmp-field may not be called. The cmp-field is read-only." However, in the ejbCreate() method in CMP in EJB 2.0, I have to use setXXX method to initialize the XXX cmp-field. Am I wrong? Can any guru help? thanks! ======================================================================== === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff EJB-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help". ======================================================================== === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff EJB-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help". ======================================================================== === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff EJB-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help". =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff EJB-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".