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