Hi,

I don't remember if I already responded to your email or not, but in case I
did not there're examples in src/examples directory where you can find
Cabin-Ship-etc. sample. It's very similar to what you're trying to achieve.
Grab the sources by CVS and do:

cd src/examples
BuildIt
InstallIt
RunIt

I'm going to take a look at your example a bit closer, but I don't exactly
know when it happens and do worry whether you have so much time to wait.

Jacek

> -----Original Message-----
> From: R. Glasius [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, October 15, 2003 2:54 PM
> To: Openejb-User list
> Subject: RE: [OpenEJB-user] CMP crosstables
> 
> 
> > Hi,
> >
> > I didn't do it before, so am not able to describe the steps 
> required to
> > get it up and running. However, as OpenEJB relies on Castor 
> to persist
> > CMP's state look at Castor's documentation where I'm quite 
> sure you'll
> > find the answer. That's the best direction I can now think of.
> >
> > Give us a chance to find it out as well once you've sorted it out.
> 
> 
> Hi Jacek,
> 
> After substantial reading and testing I could not accomplish 
> it the Castor
> way.
> I may be wrong (i hope i am wrong) and perhaps somebody with 
> more openejb
> knowledge could point me my mistake,
> but it seems that openejb looses collection/ArrayList data. The other
> bean-persistent-fields are ok.
> 
> I use the student-course paradigm: many students have many 
> courses and many
> courses have many students.
> Castors way is to put an Arraylist students in the class Course and an
> ArrayList courses in the class Student.
> You have to make set-, get- and addCourses subroutines in 
> Student and set-,
> get- and addStudents subroutines in Course. Finally you have to put a
> many-table paragraph in the mapping.xml and create the crosstable
> course_student in your database. When persisting both Student 
> and Course
> objects, Castor will populate the crosstable and hence persists the
> ArrayLists data.
> 
> My best guess, why it does not work, is that both beans must 
> be persisted in
> the same JDO transaction (between begin() and commit(). If 
> openejb persist
> per bean ( I did not look at the source) this demand would 
> not be met. But
> it is just a guess...
> 
> Here is some trace output of the client application after adding two
> students to one course:
> 
> Course.setEntityContext : course(null).students.size() 0
> Course.setCourseName : course(null).students.size() 0
> Course.ejbCreate : course(null).students.size() 0
> Course.ejbPostCreate : course(11).students.size() 0
> Course.addStudents 1 : course(11).students.size() 0
> Course.addStudents 2: added studentId 13
> Course.addStudents 3: course.students.size() 1
>                                   ^^^^^^^^^^ note: ArrayList 
> students size =
> 1
> Course.addStudents 1 : course(11).students.size() 0
>                                   ^^^^^^^^^^ note: ArrayList 
> students size =
> 0
> Course.addStudents 2: added studentId 14
> Course.addStudents 3: course.students.size() 1
> 
> I think I just have to wait for Geronimo (EJB2.0 container) with CMR
> relation fields.
> Meanwhile I will use a crosstableBean.
> 
> Best regards,
> 
> Roy
> 
> Here are the code and the config:
> --------------------------------------------------------------
> --------------
> -------------
> sql
> --------------------------------------------------------------
> --------------
> -------------
> DROP TABLE student ;
> CREATE TABLE student
> (
>     student_id INTEGER,
>     s_name VARCHAR(80)
> ) ;
> 
> DROP SEQUENCE student_seq ;
> CREATE SEQUENCE student_seq ;
> 
> 
> DROP TABLE course ;
> CREATE TABLE course
> (
>     course_id INTEGER ,
>     c_name VARCHAR(80)
> ) ;
> 
> DROP SEQUENCE course_seq ;
> CREATE SEQUENCE course_seq ;
> 
> 
> DROP TABLE course_student ;
> CREATE TABLE course_student
> (
>     course_id INTEGER ,
>     student_id INTEGER
> ) ;
> 
> DROP SEQUENCE course_student_seq ;
> CREATE SEQUENCE course_student_seq ;
> --------------------------------------------------------------
> --------------
> -------------
> mapping file:
> --------------------------------------------------------------
> --------------
> -------------
> <!DOCTYPE databases PUBLIC "-//EXOLAB/Castor Mapping DTD 
> Version 1.0//EN"
> 
> "http://castor.exolab.org/mapping.dtd";>
> 
> <mapping>
> 
>      <!--  Mapping for StudentBean  -->
>      <class name="org.acme.crosstable.StudentBean" 
> identity="studentId"
> key-generator="SEQUENCE">
>          <map-to table="student"/>
>          <field name="studentId" type="integer" direct="true">
>              <sql name="student_id" type="integer"/>
>          </field>
>          <field name="studentName" type="string" direct="true">
>              <sql name="s_name" type="varchar" dirty="check"/>
>          </field>
> 
>          <!-- Student has reference to Course, many Course's 
> per Student -->
> 
>          <field name="courses" type="org.acme.crosstable.CourseBean"
> collection="arraylist" direct="true">
>              <sql name="course_id" many-table="course_student"
> many-key="student_id"/>
>          </field>
>      </class>
> 
>      <!--  Mapping for CourseBean  -->
>      <class name="org.acme.crosstable.CourseBean" identity="courseId"
> key-generator="SEQUENCE">
>          <map-to table="course"/>
>          <field name="courseId" type="integer" direct="true">
>              <sql name="course_id" type="integer"/>
>          </field>
>          <field name="courseName" type="string" direct="true">
>              <sql name="c_name" type="varchar" dirty="check"/>
>          </field>
> 
>          <!-- Course has reference to Student, many Students 
> per Course-->
>          <field name="students" type="org.acme.crosstable.StudentBean"
> collection="arraylist" direct="true">
>              <sql name="student_id" many-table="course_student"
> many-key="course_id"/>
>          </field>
>      </class>
> 
> </mapping>
> --------------------------------------------------------------
> --------------
> -------------
> ejb-jar.xml file:
> --------------------------------------------------------------
> --------------
> -------------
> <?xml version="1.0" encoding="US-ASCII"?>
> 
> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
> JavaBeans 1.1//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd";>
> 
> <ejb-jar>
> 
>   <description>
>      application.
>   </description>
> 
>   <enterprise-beans>
> 
>     <entity>
>       <description>
>          blah
>       </description>
>       <ejb-name>StudentBean</ejb-name>
>       <home>org.acme.crosstable.StudentHome</home>
>       <remote>org.acme.crosstable.Student</remote>
>       <ejb-class>org.acme.crosstable.StudentBean</ejb-class>
>       <persistence-type>Container</persistence-type>
>       <prim-key-class>java.lang.Integer</prim-key-class>
>       <reentrant>False</reentrant>
>       <cmp-field>
>         <field-name>studentId</field-name>
>       </cmp-field>
>       <cmp-field>
>         <field-name>studentName</field-name>
>       </cmp-field>
>       <primkey-field>studentId</primkey-field>
>       <ejb-ref>
>         <ejb-ref-name>CourseBean</ejb-ref-name>
>         <ejb-ref-type>Entity</ejb-ref-type>
>         <home>org.acme.crosstable.CourseHome</home>
>         <remote>org.acme.crosstable.CourseBean</remote>
>         <ejb-link>CourseBean</ejb-link>
>       </ejb-ref>
>       <resource-ref>
>         <description>
>         reference to myDB postgresql database
>         </description>
>         <res-ref-name>jdbc/postgresql</res-ref-name>
>         <res-type>javax.sql.DataSource</res-type>
>         <res-auth>Container</res-auth>
>       </resource-ref>
>     </entity>
> 
>     <entity>
>       <description>
>       ######################################################
>       ID:  org.acme.crosstable/CourseBean
>       ######################################################
>       </description>
>       <ejb-name>CourseBean</ejb-name>
>       <home>org.acme.crosstable.CourseHome</home>
>       <remote>org.acme.crosstable.Course</remote>
>       <ejb-class>org.acme.crosstable.CourseBean</ejb-class>
>       <persistence-type>Container</persistence-type>
>       <prim-key-class>java.lang.Integer</prim-key-class>
>       <reentrant>False</reentrant>
>       <cmp-field>
>         <field-name>courseId</field-name>
>       </cmp-field>
>       <cmp-field>
>         <field-name>courseName</field-name>
>       </cmp-field>
>       <primkey-field>courseId</primkey-field>
>       <ejb-ref>
>         <ejb-ref-name>StudentBean</ejb-ref-name>
>         <ejb-ref-type>Entity</ejb-ref-type>
>         <home>org.acme.crosstable.StudentHome</home>
>         <remote>org.acme.crosstable.StudentBean</remote>
>         <ejb-link>StudentBean</ejb-link>
>       </ejb-ref>
>       <resource-ref>
>         <description>
>         reference to postgresql database
>         </description>
>         <res-ref-name>jdbc/postgresql</res-ref-name>
>         <res-type>javax.sql.DataSource</res-type>
>         <res-auth>Container</res-auth>
>       </resource-ref>
>     </entity>
> 
>   </enterprise-beans>
> 
>   <assembly-descriptor>
> 
>     <container-transaction>
>       <method>
>         <ejb-name>StudentBean</ejb-name>
>         <method-name>*</method-name>
>       </method>
>       <trans-attribute>Supports</trans-attribute>
>     </container-transaction>
> 
>     <container-transaction>
>       <method>
>         <ejb-name>CourseBean</ejb-name>
>         <method-name>*</method-name>
>       </method>
>       <trans-attribute>Supports</trans-attribute>
>     </container-transaction>
> 
>   </assembly-descriptor>
> 
> </ejb-jar>
> 
> --------------------------------------------------------------
> --------------
> -------------
> openejb-jar.xml
> --------------------------------------------------------------
> --------------
> -------------
> <?xml version="1.0"?>
> 
> <openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1";>
> 
>     <ejb-deployment ejb-name="StudentBean" deployment-id="StudentBean"
> container-id="PostgreSQL CMP Container">
>         <resource-link res-ref-name="jdbc/postgresql" 
> res-id="PostgreSQL
> JDBC Database"/>
>     </ejb-deployment>
> 
>     <ejb-deployment ejb-name="CourseBean" deployment-id="CourseBean"
> container-id="PostgreSQL CMP Container">
>         <resource-link res-ref-name="jdbc/postgresql" 
> res-id="PostgreSQL
> JDBC Database"/>
>     </ejb-deployment>
> 
> </openejb-jar>
> --------------------------------------------------------------
> --------------
> -------------
> local-database.xml
> --------------------------------------------------------------
> --------------
> -------------
> <!DOCTYPE databases PUBLIC "-//EXOLAB/Castor JDO 
> Configuration DTD Version
> 1.0//EN"
>                            "http://castor.exolab.org/jdo-conf.dtd";>
> 
> <database name="Local_TX_Database" engine="postgresql">
>     <driver class-name="org.postgresql.Driver"
> url="jdbc:postgresql://localhost/myDB">
>       <param name="user" value="pgsql"/>
>       <param name="password" value=""/>
>     </driver>
>     <mapping href="/usr/local/openejb/apps/src-cmp/mapping.xml" />
> </database>
> --------------------------------------------------------------
> --------------
> -------------
> global-database.xml
> --------------------------------------------------------------
> --------------
> -------------
> <!DOCTYPE databases PUBLIC "-//EXOLAB/Castor JDO 
> Configuration DTD Version
> 1.0//EN"
>                            "http://castor.exolab.org/jdo-conf.dtd";>
> <database name="Global_TX_Database" engine="postgresql">
>     <jndi name="java:comp/env/jdbc/postgresql" />
>     <mapping href="/usr/local/openejb/apps/src-cmp/mapping.xml" />
> </database>
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/Student.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import javax.ejb.EJBObject;
> import java.rmi.RemoteException;
> import java.util.ArrayList;
> 
> public interface Student extends EJBObject
> {
>     public Integer getStudentId() throws RemoteException;
>     public void    setStudentId(Integer studentId) throws 
> RemoteException;
> 
>     public String  getStudentName() throws RemoteException;
>     public void    setStudentName(String name) throws RemoteException;
> 
>     public void      setCourses(ArrayList courses) throws 
> RemoteException;
>     public void      addCourses(Course course) throws RemoteException;
>     public ArrayList getCourses() throws RemoteException;
> }
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/StudentBean.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import java.util.*;
> import javax.ejb.*;
> import javax.naming.*;
> 
> public class StudentBean implements EntityBean
> {
> 
>     private EntityContext context;
> 
>     // When ussing Castors direct binding, persitent fields 
> must be public
> 
>     public Integer   studentId;
>     public String    studentName;
>     public ArrayList courses = new ArrayList();
> 
>     // business methods
>     // Access methods for persistent fields
> 
>     public Integer  getStudentId(){ return this.studentId; }
>     public void     setStudentId(Integer studentId) { this.studentId =
> studentId; }
> 
>     public String getStudentName(){ return this.studentName; }
>     public void setStudentName(String studentName){ this.studentName =
> studentName; }
> 
>     // Castor many-table set/add/get methods
> 
>     public void setCourses(ArrayList courses)
>     {
>         this.courses = courses;
>     }
> 
>     public void addCourses(Course course) throws 
> java.rmi.RemoteException
>     {
>         courses.add(course);
>     }
> 
>     public ArrayList getCourses()
>     {
>         return this.courses;
>     }
> 
>     // EntityBean methods
> 
>     public Integer ejbCreate ( String name ) throws CreateException
>     {
>         setStudentName(name);
> 
>         return null;
>     }
> 
>     public void ejbPostCreate ( String name ) throws CreateException
>     {
>     }
> 
>     public void setEntityContext( EntityContext context ) throws
> EJBException
>     {
>         this.context = context;
>     }
> 
>     public void unsetEntityContext() throws EJBException
>     {
>         context = null;
>     }
> 
>   public void ejbActivate() throws EJBException
>   {
>   }
> 
>   public void ejbLoad() throws EJBException
>   {
>   }
> 
>   public void ejbPassivate() throws EJBException
>   {
>   }
> 
>   public void ejbRemove() throws RemoveException, EJBException
>   {
>   }
> 
>   public void ejbStore() throws EJBException
>   {
>   }
> }
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/StudentHome.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import javax.ejb.CreateException;
> import javax.ejb.EJBHome;
> import javax.ejb.FinderException;
> import java.rmi.RemoteException;
> 
> public interface StudentHome extends EJBHome
> {
>   public Student create( String name ) throws RemoteException,
> CreateException;
> 
>   public Student findByPrimaryKey( Integer id ) throws 
> RemoteException,
> FinderException;
> }
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/Course.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import javax.ejb.EJBObject;
> import java.rmi.RemoteException;
> import java.util.ArrayList;
> 
> public interface Course extends EJBObject
> {
>     public Integer getCourseId() throws RemoteException;
>     public void    setCourseId(Integer CourseId) throws 
> RemoteException;
> 
>     public String  getCourseName() throws RemoteException;
>     public void    setCourseName(String courseName) throws 
> RemoteException;
> 
>     public void       setStudents(ArrayList students) throws
> RemoteException;
>     public void       addStudents(Student newstudent) throws
> RemoteException;
>     public ArrayList getStudents() throws RemoteException;
> }
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/CourseBean.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import java.util.ArrayList;
> import java.rmi.RemoteException;
> import java.sql.*;
> import javax.ejb.*;
> 
> public class CourseBean implements EntityBean
> {
> 
>     private EntityContext context;
> 
>     // When ussing Castors direct binding, persitent fields 
> must be public
> 
>     public Integer    courseId;
>     public String     courseName;
>     public ArrayList students = new ArrayList();
> 
>     // business methods
>     // Access methods for persistent fields
> 
>     public Integer getCourseId()
>     {
>         trace("getCourseId");
>         return this.courseId;
>     }
> 
>     public void setCourseId(Integer courseId)
>     {
>         trace("setCourseId");
>         this.courseId = courseId;
>     }
> 
>     public String getCourseName()
>     {
>         trace("getCourseName");
>         return this.courseName;
>     }
> 
>     public void setCourseName(String courseName)
>     {
>         trace("setCourseName");
>         this.courseName = courseName;
>     }
> 
>     // Castor many-table set/add/get methods
> 
>     public void setStudents(ArrayList students)
>     {
>         this.students = students;
>         trace("setStudents");
>     }
> 
>     public void addStudents( Student newstudent ) throws 
> RemoteException
>     {
>         trace("addStudents 1");
>         this.students.add(newstudent);
> System.out.println("Course.addStudents 2: added studentId " +
> newstudent.getStudentId());
> System.out.println("Course.addStudents 3: course.students.size() " +
> this.students.size());
>     }
> 
>     public ArrayList getStudents()
>     {
>         trace("getStudents");
>         return this.students;
>     }
> 
>     // EntityBean methods
> 
>     public Integer ejbCreate(String name) throws CreateException
>     {
>         setCourseName(name);
>         trace("ejbCreate");
>         return null;
>     }
> 
>     public void ejbPostCreate(String courseName) throws
> javax.ejb.CreateException
>     {
>         trace("ejbPostCreate");
>     }
> 
>     public void ejbLoad() throws EJBException, RemoteException
>     {
>         trace("ejbLoad");
>     }
> 
>     public void setEntityContext(EntityContext ctx) throws 
> EJBException,
> RemoteException
>     {
>         context = ctx;
>         trace("setEntityContext");
>     }
> 
>     public void unsetEntityContext()
>     {
>         context = null;
>         trace("unsetEntityContext");
>     }
> 
>     public void ejbStore() throws EJBException, RemoteException
>     {
>         trace("ejbStore");
>     }
> 
>      public void ejbActivate() throws EJBException
>      {
>          trace("ejbActivate");
>      }
> 
>      public void ejbPassivate() throws EJBException
>      {
>          trace("ejbPassivate");
>      }
> 
>      public void ejbRemove() throws RemoveException, EJBException
>      {
>          trace("ejbRemove");
>      }
> 
>      private void trace(String method)
>      {
>          System.out.println("Course."+ method + " : course(" 
> + this.courseId
> + ").students.size() " + students.size());
>      }
> }
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/CourseHome.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import javax.ejb.EJBHome;
> import javax.ejb.CreateException;
> import java.rmi.RemoteException;
> 
> public interface CourseHome extends EJBHome
> {
> 
>     public Course create(String name) throws CreateException,
> RemoteException;
> 
>     public Course findByPrimaryKey(Integer primarykey) throws
> CreateException, RemoteException;
> }
> --------------------------------------------------------------
> --------------
> -------------
> org/acme/crosstable/Client.java
> --------------------------------------------------------------
> --------------
> -------------
> package org.acme.crosstable;
> 
> import javax.naming.Context;
> import javax.naming.InitialContext;
> import javax.rmi.PortableRemoteObject;
> import java.util.Properties;
> 
> public class Client
> {
>    public static void main( String[] args )
>            throws Exception
>    {
>       Properties env = new Properties();
> 
> 
>       String jndiProvider =
> "org.openejb.client.RemoteInitialContextFactory";
>       env.put( "java.naming.factory.initial", jndiProvider );
>       env.put( "java.naming.provider.url", "localhost:4201" );
>       env.put( "java.naming.security.principal", "fakeuser" );
>       env.put( "java.naming.security.credentials", "fakepass" );
>       Context ctx = new InitialContext( env );
> 
>       Object sobj = ctx.lookup( "StudentBean" );
>       sobj = PortableRemoteObject.narrow( sobj, StudentHome.class );
>       StudentHome shome = ( StudentHome ) sobj;
>       Student student1 = shome.create( "Roy" );
>       Student student2 = shome.create( "Glasius" );
> 
>       Object cobj = ctx.lookup( "CourseBean" );
>       cobj = PortableRemoteObject.narrow( cobj, CourseHome.class );
>       CourseHome chome = ( CourseHome ) cobj;
>       Course course1 = chome.create( "BeansCourse" );
> 
>       course1.addStudents(student1);
>       student1.addCourses(course1);
> 
>       course1.addStudents(student2);
>       student2.addCourses(course1);
>    }
> }
> 
> 
> 
> 
> -------------------------------------------------------
> This SF.net email is sponsored by: SF.net Giveback Program.
> SourceForge.net hosts over 70,000 Open Source Projects.
> See the people who have HELPED US provide better services:
> Click here: http://sourceforge.net/supporters.php
> _______________________________________________
> http://OpenEJB.sf.net
> OpenEJB-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/openejb-user
> 


-------------------------------------------------------
This SF.net email is sponsored by: The SF.net Donation Program.
Do you like what SourceForge.net is doing for the Open
Source Community?  Make a contribution, and help us add new
features and functionality. Click here: http://sourceforge.net/donate/
_______________________________________________
http://OpenEJB.sf.net
OpenEJB-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/openejb-user

Reply via email to