Werner,

Since you have data associated with your many-to-many, you can simplify this
by making an entity in the middle, transforming your many-to-many in to a
many-to-one, one-to-many from the ORMs perspective.

We can continue this discussion on the Hibernate forum, if you like.  I'd be
glad to help you out.

[EMAIL PROTECTED]

> -----Original Message-----
> From: news [mailto:[EMAIL PROTECTED] On Behalf Of Werner Punz
> Sent: Thursday, September 15, 2005 2:54 AM
> To: [email protected]
> Subject: Re: Hibernate: 1-to-many --> struggling
> 
> Well maybe the original guy did not use session.saveOrUpdate 
> on the parent element...
> 
> I usually deal with 1:n which usually are far less 
> problematic then m:n (which is the case where you usually 
> sink 90% of the dev time banging your head and cursing 
> hibernate left and right) is to have a 1:n rel, with a set 
> mapping and to use cascade all with a save on the root element.
> That has worked best.
> 
> The crux of hibernate is, you have so many ways to solve 
> things for everything around 100 ways, but 90 of them fail 
> with either no error or cryptic error messages once you have 
> to apply them, while there still is a huge lack of best 
> practices especially in the areas many-to-many and one-to-many
> 
> I will give an example:
> Implicit mapping, not working if you have additional data in 
> your many to many binding table, now how do you resolve that 
> you can resolve it via an explicit binding object 
> declaration, the doc is very vague on this approach,
> 
> you finally get it up and running, loading works, but 
> deleting utterly fails with a cascade error, no real help in 
> the forum, after banging your head for straight 8 hours you 
> finally know why this happens, you delete the objects with an 
> explicit delete and regenerate the binding objects, but the 
> binding table does not have a surrogate, you do that within 
> the same transaction.
> What wouldnt pose a problem in straight JDBC because you 
> clear the m:n elements out of the many to many table before 
> setting them anew, causes hibernate to choke.
> Solution, set the relational binding to lazy thus the objects 
> do not get marked as deleted before loading the parent object 
> and thus the setting works again.
> 
> It is cases like that, which are very commmon where all the 
> documentation unfortunately utterly fails and where you can 
> sink hours into hibernate.
> 
> Hibernate to my taste lacks a high level layer which resolves 
> such cases automatically, some kind of
> hibernatetool.resolveManyToManyBinding(BindingList) would 
> have helped a lot in this case.
> 
> Before Hibernate 2 it also was the session handling which 
> lacked those tools, that fortunately is resolved now.
> 
> 
> 
> Rafael Nami wrote:
> > I'm not an expert in this, but I think if you use another type of
> > collection, like a Set or a List, this behavior won't 
> occur. I usually
> > use Sets to many to many and Lists to bidirecional relations.
> > 
> > Hope that it helps
> > 
> > Rafael Mauricio Nami
> > 
> > 2005/9/12, Dave <[EMAIL PROTECTED]>:
> > 
> >>I am struggling with Hibernate 1-to-many mapping(collection). 
> >>Could someone tell me how to manage the collection of 
> one-to-many mapping? a
> >>little code will be very helpful.
> >>
> >>I have a very simple one-to-many relationship: an Item has 
> many Picture(s). 
> >>
> >>ENTITY -- Item 
> >>@... 
> >>public class item { 
> >>private Collection pictures; 
> >>private Integer id; 
> >>
> >>// getter/setter for id and @Id(...) 
> >>
> >>
> >>@OneToMany(cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER,
> >>mappedBy="item") 
> >>public Collection getPictures() { 
> >>return pictures; 
> >>} 
> >>
> >>public void setPictures(Collection pictures) { 
> >>this.pictures = pictures; 
> >>} 
> >>
> >>public void addPicture(Picture p) { 
> >>
> >>if (pictures == null) 
> >>pictures = new ArrayList(); 
> >>pictures.add(p); 
> >>
> >>} 
> >>} 
> >>
> >>ENTITY Picture -- 
> >>@ .... 
> >>public class Picture { 
> >>private Item item; 
> >>private Integer id; 
> >>
> >>// constructor 
> >>public Picture(Item item, ....) { 
> >>this.item = item; 
> >>.... 
> >>} 
> >>// getter/setter for id and @Id(...) 
> >>
> >>@ManyToOne 
> >>@JoinColumn(name="itemId") 
> >>public Item getItem() { 
> >>return item; 
> >>} 
> >>
> >>public void setItem(Item item) { 
> >>this.item = item; 
> >>} 
> >>} 
> >>
> >>I create an Item in persistence without any pictures. Then 
> use a session
> >>bean to add pictures to the item. 
> >>
> >>Session Bean -- 
> >>
> >>@Stateless 
> >>public class ItemManagerBean implements ItemManager { 
> >>
> >>public void addPictureToItem(Item item, Picture p) { 
> >>item.addPicture(p); 
> >>em.merge(item); 
> >>} 
> >>
> >>} 
> >>
> >>The merge() ignores those pictures that are already in persistence. 
> >>Add picture P1: ---> persistence: P1, ( great!) 
> >>Add picture P2 ---> persistence: P1, P1, P2 (P1 duplicated) 
> >>Add picture P3 ---> persistence: P1, P1, P2, P1, P2, P3 
> >>
> >>Obviously, the merge() ignored what are already in 
> persistence. All pictures
> >>has Id. EM.merge() should be able to know P1 is already in 
> persistence when
> >>adding P2. 
> >>
> >>I f I do not call merge(), nothing will be persisted. 
> >>
> >>I do this from Web GUI. Transaction is thread-based.(default) 
> >>
> >>Do I miss anything? or Is this a Hibernate bug ? 
> >>
> >>
> >>----------------- 
> >>
> >>I tried one thing: Create a picture in persistence using 
> another session
> >>bean. Then use em.refresh(item). First time it works, and I 
> can see the
> >>picture from item.getPictures(). 
> >>Then I create another picture the same way, and call 
> em.refresh(item) again,
> >>but this time item.getPictures() does not have the second picture. 
> >>Not that I have changed the Cascade type to REFRESH. 
> >>
> >>Basically what is the way to manage the collection in 
> one-to-many mapping? 
> >>
> >>I am using JBoss 4.0.3RC1 on XP. 
> >>
> >> Please help! Thank you. 
> >>
> >>Dave 
> >>
> >>
> >>
> >>__________________________________________________
> >>Do You Yahoo!?
> >>Tired of spam? Yahoo! Mail has the best spam protection around 
> >>http://mail.yahoo.com 
> > 
> > 
> > 
> 

Reply via email to