0 Replies Latest reply on Jun 6, 2008 5:12 AM by li.ni

    Two-way association problem

    li.ni

      Hi,

      I have met a problem using EntityHome with Seam, I have found a solution by modifying a setter but I want to be sure it is the proper way to do it.


      In order to implement a function “Post a topic in a forum�, I have created 2 EntityBeans : Subject and Message. There is a oneToMany (two-way association) relation between Subjet and Message.



      public class Subject implements Serializable {

      ...

      private List associatedMessages = new LinkedList();


      @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ownerSubject")

      @OrderBy(value = "messageId ASC")

      public List getAssociatedMessages()

      {

      return associatedMessages;

      }

      public void setAssociatedMessages(List associatedMessages)

      {

      this.associatedMessages = associatedMessages;

      }

      ...


      }


      public class Message implements Serializable {

      ...

      private Subject ownerSubject;

      @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)

      @JoinColumn(name = "OWNER_SUBJECT_ID")

      public Subject getOwnerSubject()

      {

      return ownerSubject;

      }

      public void setOwnerSubject(Subject ownerSubject)

      {

      this.ownerSubject = ownerSubject;


      }

      }



      When a Subject instance is created, at the same time a 1st Message instance is created too and added to the List the subject, as shown in createSubject2() of the SessionBean SubjectHome



      @Name("subjectHome")

      public class SubjectHome extends EntityHome

      {

      ...

      @In(required=false)

      MessageHome messageHome;



      public void createSubject2()

      {

      this.messageHome.getInstance().setOwnerSubject(this.getInstance());

      this.messageHome.persist();

      this.logger.info("NUMBER OF ASSOCIATED MESSAGES : " + this.instance.getAssociatedMessages().size());

      }

      ...

      }


      I've checked: 2 instances were successfully persisted, so in the datebase, 2 new rows were inserted in Subject table and Message table with no problem.


      However in the console :

      INFO [SubjectHome] NUMBER OF ASSOCIATED MESSAGES : 0

      And when I navigate to the webpage which is used to show something of corresponding message of a Subject i met such error:

      CODE:

      #{subject.associatedMessages.get(0).submitTime}

      ERROR:

      /subjectList.xhtml: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0



      So I add a line in the Setter in my Message EntityBean :


      public void setOwnerSubject(Subject ownerSubject) {

      this.ownerSubject = ownerSubject;

      this.ownerSubject.getAssociatedMessages().add(this);

      }

      This solves our problem, the new message is well in the subject List attribute without having to open a new session.

      I just want to verify if it's ok to add additional line in Setter of EntityBean, just like what I did ? Thank you!

      Regards

      Li