Java, problem z mapowaniem - hibernate

0

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:

  1. Words (która zawiera 300 000 słów)
  2. Descriptions (która zawiera 85 opisów)
  3. 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? :)

0

Git jest ;) zanim dodasz nowy description to sprawdź czy w bazie nie masz już takiego. Jeżeli masz to pobierz go i dodaj do word. Obecnie opisy będą unikalne tylko w obrębie pojedynczego słowa, a nie kontekstu utrwalania. Każdy word jest utrwalany ze swoim nowym i unikalnym zestawem description.

0

Ja się tylko dodatkowo zapytam: Czemu często (może i zawsze) widzę że ktoś używa hibernate'a to korzysta z mapowania za pomocą plików xml a nie adnotacji ??? Ja używam adnotacji i nie widzę większego powodu, dla którego miałbym używać dodatkowych plików. Potrafi ktoś odpowiedzieć na moje pytanie ?? Czy to po prostu kwestia przyzwyczajenia ?

0

Raczej podręczników które tak robią co automatycznie ty też zaczynasz robić ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1