FYI, as a workaround, you can make bidirectional relationships work by
manually setting both sides of the relationship.  Orion currently seems
to treat a bidirectional relationship as two unidirectional
relationships, so everything works as long as you update both sides.

Assuming hypothetical entities foo and bar, with a 1->M relationship
foo->bar, the method Foo.addBar can look like this:

void addBar(Bar bar)    // on Foo
{
        this.getBars().add(bar);

        // TODO: Remove this code when bidir relationships work         
        try
        {
                bar.setFoo((Foo)ejbContext.getEJBObject());
        }
        catch (java.rmi.RemoteException ex)
        {
                throw new EJBException(ex);
        }
}

Of course you get data duplication in the database, but it works :-)

Jeff Schnitzer
[EMAIL PROTECTED]

>-----Original Message-----
>From: Tim Drury [mailto:[EMAIL PROTECTED]]
>Sent: Monday, December 11, 2000 10:43 AM
>To: Orion-Interest
>Subject: RE: EJB2.0 Generated class uncompilable
>
>
>
>I don't think we've ever cleared up whether
>this is needed or not:
>
>in ejb-jar.xml:
>   <entity>
>      <cmp-version>2.x</cmp-version>
>      ...
>
>Your bar ejb seems to reference your foo ejb
>and visa versa.  Bi-directional relationships
>are in-the-works.  See bug #153 in Bugzilla.
>
>-tim
>
>
>
>> -----Original Message-----
>> From: Peter Pontbriand [mailto:[EMAIL PROTECTED]]
>> Sent: Monday, December 11, 2000 11:38 AM
>> To: Orion-Interest
>> Subject: Re: EJB2.0 Generated class uncompilable
>> 
>> 
>> 
>> ----- Original Message -----
>> From: "Tim Drury" <[EMAIL PROTECTED]>
>> To: "Orion-Interest" <[EMAIL PROTECTED]>
>> Sent: Friday, December 08, 2000 5:39 PM
>> Subject: RE: EJB2.0 Generated class uncompilable
>> 
>> 
>> >
>> > Since your bean is called "Foo" I'm going to guess
>> > that it is a trivial "Hello World" bean.  Why don't
>> > you post the bean code and the ejb-jar.xml (don't
>> > attach/zip/etc - just dump it)?
>> >
>> > -tim
>> 
>> Well, it is rather trivial at the moment. That makes the 
>> deployments errors
>> all the more frustrating, of course.
>> BTW, blowing away the entire deployment does _not_ eliminate 
>> the deploytment
>> problems - that was one of the first things we tried.
>> 
>> Here's the current state of the source:
>> 
>> Foo.java is:
>> 
>> ---------------------
>> /* Generated by Together */
>> 
>> package com.foo.components.foo.bean;
>> 
>> import javax.ejb.EntityBean;
>> import javax.ejb.EntityContext;
>> import java.rmi.RemoteException;
>> import javax.ejb.EJBException;
>> import javax.ejb.CreateException;
>> import java.sql.SQLException;
>> import javax.ejb.FinderException;
>> import java.util.Set;
>> 
>> import com.canlink.components.base.GUID;
>> import com.foo.components.foo.*;
>> 
>> public abstract class FooBean implements EntityBean, FooBusiness
>> {
>>     private EntityContext ejbContext;
>>     private transient boolean isModified = false;
>> 
>>     public void setEntityContext(EntityContext context) throws
>> RemoteException, EJBException
>>     {
>>         ejbContext = context;
>>     }
>> 
>>     public void unsetEntityContext() throws RemoteException, 
>> EJBException
>>     {
>>         ejbContext = null;
>>     }
>> 
>>     public void ejbActivate() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public void ejbPassivate() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public void ejbRemove() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public void ejbStore() throws RemoteException, EJBException
>>     {
>>         isModified = false;
>>     }
>> 
>>     public void ejbLoad() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public EntityPK ejbCreate(Set bars)
>>         throws
>>             CreateException,
>>             EJBException,
>>             RemoteException,
>>             SQLException
>>     {
>>      setIdentity(GUID.getNewGUID());
>>         setBars(bars);
>>         isModified = true;
>>         return null;
>>     }
>> 
>>     public void ejbPostCreate(Set bars)
>>         throws CreateException, EJBException, 
>> RemoteException, SQLException
>>     {}
>> 
>>  public boolean isModified()
>>     {
>>         return isModified;
>>     }
>> 
>>     abstract public Set getBars();
>> 
>>     abstract protected void setBars(Set bars);
>> 
>>  public FooValueObject get()
>>         throws RemoteException
>>     {
>>   return new FooValueObject(
>>             (EntityPK)ejbContext.getPrimaryKey(),
>>             getBars());
>>     }
>> 
>>  public FooValueObject set(FooValueObject mutator)
>>         throws  RemoteException
>>     {
>>         setBars(mutator.getBars());
>>         isModified = true;
>>         return get();
>>     }
>> 
>>     abstract public long getIdentity();
>> 
>>     abstract protected void setIdentity(long identity);
>> 
>> }
>> ---------------------
>> 
>> Bar.java is:
>> ---------------------
>> /* Generated by Together */
>> 
>> package com.foo.components.foo.bean;
>> 
>> import javax.ejb.EntityBean;
>> import javax.ejb.EntityContext;
>> import java.rmi.RemoteException;
>> import javax.ejb.EJBException;
>> import javax.ejb.CreateException;
>> import java.sql.SQLException;
>> import javax.ejb.FinderException;
>> import java.util.Set;
>> 
>> import com.canlink.components.base.GUID;
>> import com.foo.components.foo.*;
>> 
>> public abstract class BarBean implements BarBusiness, EntityBean
>> {
>>     private EntityContext ejbContext;
>>     private boolean isModified = false;
>> 
>>     public void setEntityContext(EntityContext context) throws
>> RemoteException, EJBException
>>     {
>>         ejbContext = context;
>>     }
>> 
>>     public void unsetEntityContext() throws RemoteException, 
>> EJBException
>>     {
>>         ejbContext = null;
>>     }
>> 
>>     public void ejbActivate() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public void ejbPassivate() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public void ejbRemove() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public void ejbStore() throws RemoteException, EJBException
>>     {
>>         isModified = false;
>>     }
>> 
>>     public void ejbLoad() throws RemoteException, EJBException
>>     {
>>     }
>> 
>>     public EntityPK ejbCreate(Set foos)
>>         throws
>>             CreateException,
>>             EJBException,
>>             RemoteException,
>>             SQLException
>>     {
>>      setIdentity(GUID.getNewGUID());
>>         isModified = true;
>>         return null;
>>     }
>> 
>>     public void ejbPostCreate(Set foos)
>>         throws CreateException, EJBException, 
>> RemoteException, SQLException
>>     {}
>> 
>>  public boolean isModified()
>>     {
>>         return isModified;
>>     }
>> 
>>     abstract public Set getFoos();
>> 
>>     abstract protected void setFoos(Set foos);
>> 
>>  public BarValueObject get()
>>         throws RemoteException
>>     {
>>         return new BarValueObject(
>>             (EntityPK)ejbContext.getPrimaryKey(),
>>             getFoos());
>>     }
>> 
>>     public BarValueObject set(BarValueObject mutator)
>>         throws  RemoteException
>>     {
>>         setFoos(mutator.getFoos());
>> 
>>         isModified = true;
>>         return get();
>>     }
>> 
>>     abstract public long getIdentity();
>> 
>>     abstract protected void setIdentity(long identity);
>> }
>> ---------------------
>> 
>> ejb-jar.xml is:
>> ---------------------
>> <?xml version="1.0"?>
>> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
>> JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd">
>> 
>> <ejb-jar>
>>     <enterprise-beans>
>>         <entity>
>>             <description>A Bar, having a set of Foos</description>
>>             <display-name>Bar_Component</display-name>
>>             <ejb-name>BarEJB</ejb-name>
>>             <abstract-schema-name>BarEJBSchema</abstract-schema-name>
>>             <home>com.foo.components.foo.BarHome</home>
>>             <remote>com.foo.components.foo.Bar</remote>
>>             
><ejb-class>com.foo.components.foo.bean.BarBean</ejb-class>
>>             <persistence-type>Container</persistence-type>
>>             
>> <prim-key-class>com.foo.components.foo.EntityPK</prim-key-class>
>>             <reentrant>False</reentrant>
>>             <cmp-field>
>>                 <field-name>identity</field-name>
>>             </cmp-field>
>>             <cmp-field>
>>                 <field-name>foos</field-name>
>>             </cmp-field>
>>             <ejb-ref>
>>                 <ejb-ref-name>ejb/FooEJB</ejb-ref-name>
>>                 <ejb-ref-type>Entity</ejb-ref-type>
>>                 <home>com.foo.components.foo.FooHome</home>
>>                 <remote>com.foo.components.foo.Foo</remote>
>>                 <ejb-link>ejb/FooEJB</ejb-link>
>>             </ejb-ref>
>>         </entity>
>>         <entity>
>>             <description>A Foo having a set of Bars</description>
>>             <display-name>Foo_Component</display-name>
>>             <ejb-name>FooEJB</ejb-name>
>>             <abstract-schema-name>FooEJBSchema</abstract-schema-name>
>>             <home>com.foo.components.foo.FooHome</home>
>>             <remote>com.foo.components.foo.Foo</remote>
>>             
><ejb-class>com.foo.components.foo.bean.FooBean</ejb-class>
>>             
>> <prim-key-class>com.foo.components.foo.EntityPK</prim-key-class>
>>             <reentrant>False</reentrant>
>>             <persistence-type>Container</persistence-type>
>>             <cmp-field>
>>                 <field-name>identity</field-name>
>>             </cmp-field>
>>             <cmp-field>
>>                 <field-name>bars</field-name>
>>             </cmp-field>
>>             <ejb-ref>
>>                 <ejb-ref-name>ejb/BarEJB</ejb-ref-name>
>>                 <ejb-ref-type>Entity</ejb-ref-type>
>>                 <home>com.foo.components.foo.BarHome</home>
>>                 <remote>com.foo.components.foo.Bar</remote>
>>                 <ejb-link>ejb/BarEJB</ejb-link>
>>             </ejb-ref>
>>         </entity>
>>     </enterprise-beans>
>>     <relationships>
>>         <ejb-relation>
>>             <ejb-relation-name>Foo-Bar</ejb-relation-name>
>>             <ejb-relationship-role>
>> 
>> <ejb-relationship-role-name>foo-has-bars</ejb-relationship-role-name>
>>                 <multiplicity>many</multiplicity>
>>                 <role-source>
>>                     <ejb-name>FooEJB</ejb-name>
>>                 </role-source>
>>                 <cmr-field>
>>                     <cmr-field-name>bars</cmr-field-name>
>>                     
>> <cmr-field-type>java.util.Collection</cmr-field-type>
>>                 </cmr-field>
>>             </ejb-relationship-role>
>>             <ejb-relationship-role>
>> 
>> <ejb-relationship-role-name>bar-has-foos</ejb-relationship-role-name>
>>                 <multiplicity>many</multiplicity>
>>                 <role-source>
>>                     <ejb-name>BarEJB</ejb-name>
>>                 </role-source>
>>                 <cmr-field>
>>                     <cmr-field-name>foos</cmr-field-name>
>>                     
>> <cmr-field-type>java.util.Collection</cmr-field-type>
>>                 </cmr-field>
>>             </ejb-relationship-role>
>>         </ejb-relation>
>>     </relationships>
>> </ejb-jar>
>> ---------------------
>> 
>> P. Pontbriand
>> Canlink Interactive Technologies inc.
>> 
>> 
>
>

Reply via email to