I have a many to many relationship that is handled by a join table. Here's the 
simple "diagram" :
campaign -> campaign_adslot_xref <- ad_slot

When I create a new campaign object and add adslots to the relationship to get 
the entries in the join table created, for some reason, persist is trying to 
create an entry in the ad_slot table when the object already exists. Therefore, 
I get a duplicate key exception. When I use merge instead of persist, this 
works fine. I know merge has a bit of overhead and checking to see if entites 
exist in the db but my AdSlot object is in the persistentcontext so I am not 
sure why it is trying to be created. 

The POJO's are:


  | @Entity
  | 
  | @Table(name="campaign")
  | 
  | public class ParentCampaign implements Serializable {
  |         private long id;
  | 
  |     private Set<AdSlot>   adSlots;
  | 
  |     @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, 
mappedBy="campaigns")
  | 
  |     public Set<AdSlot> getAdSlots() {
  | 
  |           return adSlots;
  | 
  |        }
  | 
  |     
  | 
  |     public void setAdSlots(Set<AdSlot> adSlots) {
  | 
  |         this.adSlots = adSlots;
  | 
  |     }
  | 
  |        @Override
  | 
  |        public int hashCode() {
  | 
  |                     int hash = 7;
  | 
  |                     hash = 31 * hash + (int)id;
  | 
  |                     hash = 31 * hash + ((null == name) ? 0 : 
name.hashCode());
  | 
  |                     return hash; 
  | 
  |        }
  | 
  | 
  | 
  |         @Override
  | 
  |             public boolean equals(Object obj) {
  | 
  |                 if (obj == this) return true;
  | 
  |                   
  | 
  |             if (null == obj || !(obj instanceof ParentCampaign)) {
  | 
  |                     return false;
  | 
  |             }
  | 
  |             
  | 
  |             ParentCampaign other = (ParentCampaign)obj;
  | 
  |             
  | 
  |             if ((id != other.getId())) {
  | 
  |                     return false;
  | 
  |             }
  | 
  |             
  | 
  |                     return true;
  | 
  |             }
  | 
  | 
  | }
  | 
  | @Entity
  | @Table(name="ad_slot")
  | public class AdSlot implements Serializable {
  |     private long                id;
  |     private Set<ParentCampaign> campaigns;          
  | 
  |     @ManyToMany
  |     @JoinTable(name = "campaign_adslot_xref",
  |                                joinColumns = {
  |                                           @JoinColumn(name = "ad_slot_id")
  |                                           },
  |                        inverseJoinColumns = {
  |                                           @JoinColumn(name = "campaign_id")
  |                                             }
  |                    )
  |     
  |    public Set<ParentCampaign> getCampaigns()
  |    {
  |       return campaigns;
  |    }
  |     
  |    public void setCampaigns(Set<ParentCampaign> campaigns) {
  |       this.campaigns = campaigns;
  |    }
  | 

Here's where I setup the newly created Campaign object with selected AdSlots.

  |                     if (null != selectedAdSlots && selectedAdSlots.length > 
0) {
  | 
  |                             for (int k=0; k < selectedAdSlots.length; k++) {
  | 
  |                                     AdSlot as = 
Utils.getAdDAO().findAdSlotLazyLoadAll(new Long(selectedAdSlots[k]));           
                            
  | 
  | 
  | 
  |                                     if (null == 
currentCampaign.getAdSlots()) {
  | 
  |                                             currentCampaign.setAdSlots(new 
HashSet<AdSlot>());
  | 
  |                                     }
  | 
  |                                     
  | 
  |                                     as.getCampaigns().add(currentCampaign);
  | 
  |                                     currentCampaign.getAdSlots().add(as);
  | 
  |                             }
  | 
  |                     }
  | 
  | 

The findAdSlotLazyLoadAll looks like

  |     public AdSlot findAdSlotLazyLoadAll(long id) {
  | 
  |             return (AdSlot)em.createQuery("FROM AdSlot a " +
  | 
  |                           "LEFT JOIN FETCH a.program " +
  | 
  |                           "LEFT JOIN FETCH a.campaigns " +
  | 
  |                           "WHERE a.id = :id ") 
  | 
  |                       .setParameter("id", id)
  | 
  |                       .getSingleResult();
  | 
  |     }
  | 
  | 
  | 


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

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3961735
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to