[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - OneToMany Behaviour

linux.enthusiast768 do-not-reply at jboss.com
Tue Jan 15 03:34:30 EST 2008


I have a requirement to model a ManyToMany with additional attributes in the intersection table and based on all my reaearch, it looks like modelling this as a 2 OneToMany relationships is the right approach.

Design.
1. Create three clases  Class A, ClassB and ClassAB (Intersection)
2. Define OneToMany from A -> AB
3. Define OneToMany from B -> AB

I wanted to clarify few observation that I have, before going ahead and completeing the implementation.


Class A:

@Entity
  | @Table(name = "A")
  | public  class A {
  |     ...
  |     @OneToMany(mappedBy="A")
  |     private List<AB> ab;
  |     public void setAb(List<AB> ab) {
  |         this.ab = ab;
  |     }      
  | }


Class AB:

@Entity
  | @Table(name = "AB")
  | public  class AB {
  |    /*
  |         Do we need to specify an @Id column? It looks like
  |         the code works only if I define a seperate @id column as
  |         shown below. Also tried defining @Id as column "A_ID" with no
  |         success. Did I miss something?
  |     */
  |     @Id
  |     @Column(name="AB_ID")
  |     private int id;
  |     public void setId() {
  |         return id;
  |     }
  |     ...
  |     @ManyToOne
  |     @JoinColumn(name = "A_ID", nullable=false)
  |     private A a;
  |     public void setA(A a) {
  |         this.a = a;
  |     }      
  | }



Test Case:


public class ATest {
  |     @Test
  |     public void createAWithAB() {
  |         ...
  |         List<AB> abList = new ArrayList<AB>();
  |         
  |         //Create A using appropriate constructor
  |         A  a = new A("....");
  |         
  |         //Create a new Party Address and set the Location.
  |         AB ab = new AB();
  |         ab.setId(100);
  |         ab.setA(a);  //Set A on the intersection AB
  |         abList.add(ab);
  | 
  |         a.setAB(abList);
  |         
  |         // Creates an Person
  |         trans.begin();
  |        
  |        /*
  |           Should the AB record get created when we make the 
  |           following call
  |        */   
  |        em.persist(a);  //Persists A
  | 
  |        /*
  |           Do we need to make a explicity call to persist AB?
  |           It looks like that the AB record only gets sved if we 
  |           make this following Persist call 
  |           
  |        */           
  |         em.persist(ab); //Persisit AB
  |         trans.commit();
  |     }
  | }

Please let me know whether my obsevations are correct. Otherwise can you please provide some guidance on how to fix these issues. If correct, then what is the relevance of the @OneToMnay annotation in the "Class A" and the setter "setAB()"?

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

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



More information about the jboss-user mailing list