-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Seltsames Many2Many Verhalten
PostPosted: Wed Feb 10, 2010 10:12 am 
Newbie

Joined: Wed Feb 10, 2010 9:40 am
Posts: 2
Ich habe mir gedacht ich mache mir mal ein einfaches Beispiel. Ich habe ein Item und das kann mehrere Tags haben. Ein Tag kann auch von mehreren Items verwendet werden. Als einfaches Beispiel:
Ein Joghurt hat den Tag Bio. Ebenso kann eine Tomate den Tag Bio haben. Also bastelte ich mir per annotations das folgende (getter und setter lasse ich einfach mal weg):
Klasse Item:
Code:
public class Item implements Serializable{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column (name="ITEM_ID")
   private int id;
   
       @Column (name="NAME")
   private String name;
   
        @ManyToMany(cascade = CascadeType.ALL )
   @JoinTable(name="ItemTagJoin_Table",
         joinColumns={@JoinColumn(name="ITEM_ID")},
         inverseJoinColumns={@JoinColumn(name="TAG_ID")})
   private Set<Tag> tags;
....
}

Code:
public class Tag {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column (name="TAG_ID")
   private int id;
   
       @Column (name="NAME",nullable=false,unique=true)
   private String name;
...
}

Nun machte ich einen Test und legte ein Tag und zwei items an und wies BEIDEN das gleiche Tag (z.B. Bio) zu.
Das speichern mit Hibernate funktionierte ohne Probleme und auch die Jointabelle wurde angelegt.
Jedoch verhält sich Hibernate beim Löschen seltsam.
Löscht man ein item, so wird das Item entfernt, der Eintrag in der JoinTabelle UND das Tag, obwohl es noch von einem anderen Objekt (nämlich dem 2ten item) referenziert wird.
Also dachte ich mir als Ösung ok dann, lasse ich das löschen der Tags eben nicht kaskadieren zu. Also versuchte ich:
Code:
public class Item implements Serializable{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column (name="ITEM_ID")
   private int id;
   
       @Column (name="NAME")
   private String name;
   
        @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE} )
   @JoinTable(name="ItemTagJoin_Table",
         joinColumns={@JoinColumn(name="ITEM_ID")},
         inverseJoinColumns={@JoinColumn(name="TAG_ID")})
   private Set<Tag> tags;
....
}

Doch daraufhin erhalte ich immer die Exception:
Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance

Was im Prinzip keinen Sinn macht, da dass Tag ja kaskadieren gespeichert werden soll, und so ja auch angegeben ist. Wer kann mir sagen wo mein Denkfehler hierbei liegt? (auf jeden Fall finde ich dass die Many2Many Beziehung nicht erwartungskonform funktioniert). Vielen Dank


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.