Witam. Ostatnio zacząłem uczyć się hibernate, ale jedna rzecz kompletnie nie chce mi zadziałać.
Do rzeczy:
Mam przygotowane dane które chce dodać do dwóch tabel: Words i Descriptions (jest to 300 000 obiektów Word oraz 85 obiektów Description), które są w relacji many-to-many.
Oczekiwany przeze mnie rezultat to wygenerwoanie 3 tabel:
- Words (która zawiera 300 000 słów)
- Descriptions (która zawiera 85 opisów)
- WordsDescriptions (która ma 2 kolumny (IdWord, IdDescription) oraz ~400 000 tysięcy powiązań wcześniejszymi 2 tabelami)
Niestety za każdym razem gdy generuję bazę danych, Hibernate dodaje do niej 400 000 obiektów Description (po prostu cały czas się powtarzają)
Kod programu:
Klasa Word:
public class Word {
private long id;
private String word;
private Set descriptions = new HashSet();
}
Klasa Description:
public class Description {
private long id;
private String description;
}
Mapowanie wygląda następująco:
<class name="Word" table="Words">
<id name="id" column="idWord"><generator class="native"/></id>
<property name="word" column="Word" length="30" not-null="true"/>
<set name="descriptions" table="WordsDescriptions" cascade="all">
<key column="idWord" />
<many-to-many column="idDescription" class="Description" />
</set>
</class>
<class name="Description" table="Descriptions">
<id name="id" column="idDescription"><generator class="native"/></id>
<property name="description" column="Description" length="150" not-null="true"/>
</class>
Być może problem leży w dodawaniu do bazy danych. Wszystkie dane mam zapisane we wcześniej stworzonej klasie OldWord:
public class OldWord implements Serializable {
String word;
ArrayList<String> descriptions;
}
Tak więc samo dodawanie do bazy danych przy użyciu hibernate wygląda tak:
HashSet<OldWord> wordsData = getAllData(); //tworzony jest Set, który zawiera wszystkie informacje.
ArrayList<Word> words = new ArrayList<Word>(); // lista słów do dodania
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
for (Old.Word w : wordsData) {
Word wrd = new Word(); //Tworze nowy obiekt typu Word - (słowo)
wrd.setWord(w.getWord());
for (String s : w.getDescription()) { //Pobiera kolejne description z OldWorda
Description d = new Description();
d.setDescription(s);
wrd.addDescription(d); //Dodaje description d do HashSetu w obiekcje typu Word
}
session.save(wrd);
}
tx.commit();
session.close();
Prawdopodobnie problemem jest to że rzeczywiście tworzę 400 000 nowy obiektów typu Description. Tyko nie mam pojęcia jak to zrobić inaczej ...
Pomożecie? :)