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