Yes that is a good place, and that is what I did
but there were another bunch of issues by
using that mapping type...
just posted a long explanation in the forum regarding
all the problems you run into with many-to-many
Joshua Davis wrote:
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