[jboss-dev-forums] [Design of EJB 3.0] - ManyToMany enhancement?

joe.marques@jboss.com do-not-reply at jboss.com
Fri Jan 19 03:15:53 EST 2007


Given this object model:


  | Object_A    LinkT    Object_B
  |    Aid  ---  Aid
  |              Bid  ---  Bid   
  |             Stuff
  | 

I would like to use the following ManyToMany style on classes A & B:


  | @Entity
  | @Table(name = "Object_A")
  | class A {
  |    @ManyToMany
  |    @JoinTable(name="LinkT",
  |       joinColumns={@JoinColumn(name="Aid")},
  |       inverseJoinColumns={@JoinColumn(name="BiD")})
  |    List<B> Bs = new ArrayList<B>();
  | }
  | 
  | @Entity
  | @Table(name = "Object_B")
  | class B {
  |    @ManyToMany(mappedBy="Bs")
  |    List<A> As = new ArrayList<A>();
  | }
  | 

But I also want to be able to access the linking table directly, because it has extra metadata called "stuff" that I insert directly into it with a different Entity mapped directly on top of it:


  | @Entity
  | @Table(name = "LinkT")
  | class Link {
  |    // Aid, Bid, and Stuff
  | }
  | 

Thus, I can do one of two things right now:

1) Use the @ManyToMany annotations to construct the relationships.  This allows me to navigate via getAs() and getBs() to the other side of the relationship and back again.  However, doing it this way prevents me from inserting the additional "stuff" qualifier, which can only be calculated at insertion-time.

2) I can use a slightly more obtuse procedure to insert data into the linking table via the Link entity.  Here, I've ensured that the data in all three tables is correct, and that the relational part is identical to what is persisted in the above scenario.  This method affords me the additional opportunity to insert this qualifying "stuff" into the linking table.  Unfortunately, when I go to access the relationships - getAs() and getBs() - they always return empty sets.

Now, I went into all of this presuming that this was most likely a limitation of the current JBoss ejb3 implementation (inserting data through a direct map on top of the linking table, and selecting from the @ManyToMany context), but it would sure be nice if this was a JBoss extension.

After the data is inserted into the linking table with the additional "stuff" attached to it, then you could choose the complexity of your JPQL according to the needs in your calling context:

A simple condition:

  | SELECT someA FROM A someA, IN (someA.Bs) someB
  | WHERE someB.property=<value>
  | 

A complex condition, requiring the use of "stuff":

  | SELECT someA FROM A someA, LinkT link
  | WHERE someA.Aid = link.Aid
  | AND link.stuff=<value>
  | 

Thoughts on this?

-joseph

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4003685#4003685

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4003685



More information about the jboss-dev-forums mailing list