Hallo zusammen,
da ich jetzt schon länger suche und noch immer keine Lösung für mein Problem gefunden habe versuche ich es einfach mal hier.
Zur Problemstellung (vereinfacht):
Ich habe ein XML-File mit Nachrichten bestehend aus Headline, Datum und Anbieter.
Eine Nachricht kann mehrere Anbieter haben.
Ein Anbieter wiederum kann mehreren Nachrichten zugeordnet werden.
Meine Aufgabe ist es die Daten vom XML-File in die Datenbank zu buchen.
Einfügen in die Tabellen funktioniert. Die Beziehungstabelle wird auch befüllt. Das Problem bei der ganzen sache ist nur, dass die Beziehungstabelle nicht befüllt wird, wenn der Anbieter bereits in der Datenbank existiert. Vermutlich weil kein Autoincrement der id erfolgt und diese somit auch nicht zurückgeliefert wird.
Kann ich Hibernate irgendwie sagen, dass er sich die id eines Anbieters holen soll falls der Insert wegen eines Duplicate Entrys nicht ausgeführt werden kann und dann die Beziehungstabelle mit diesem Wert befüllt?
Ich bedanke mich schon mal für alle eventuellen Antworten.
Buchempfehlungen und Blogeinträge zu dem Thema sind natürlich herzlich willkommen.
LG
Fabian
Die Tabellen in Mysql sind folgendermaßen aufgebaut:
Tabelle: news
Spalte: id (Primärschlüssel)
Spalte: headline
Spalte: datum
Tabelle: news_anbieter (Verbindungstabelle)
Spalte: n_id (ID aus Tabelle news)
Spalte: a_id (ID aus Tabelle anbieter)
Tabelle: anbieter
Spalte: id (Primärschlüssel)
Spalte: name (Unique)
Ich hab mir nach dem Vorbild die Mapping files zusammengebaut:
http://www.torsten-horn.de/techdocs/java-hibernate.htmCode:
<hibernate-mapping>
<class name="nachrichten.entity.News" table="news" catalog="portal_nachrichten_fa">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="headline" type="string">
<column name="headline" length="200" not-null="true" />
</property>
<property name="date" type="timestamp">
<column name="date" length="19" />
</property>
<set name="anbieter" table="news_anbieter" lazy="true">
<key column="N_ID"/>
<many-to-many class="nachrichten.entity.Anbieter" column="A_ID"/>
</set>
</class>
</hibernate-mapping>
Code:
<hibernate-mapping>
<class name="nachrichten.entity.Anbieter" table="anbieter" catalog="portal_nachrichten_fa">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="50" unique="true" />
</property>
<set name="news" table="news_anbieter" lazy="true">
<key column="A_ID"/>
<many-to-many class="nachrichten.entity.News" column="N_ID"/>
</set>
</class>
</hibernate-mapping>
POJOs
Code:
public class Anbieter implements java.io.Serializable
{
private Integer id;
private String name;
private Set news = new HashSet();
public Anbieter()
{
}
public Anbieter(String name)
{
this.name = name;
}
public Integer getId()
{
return this.id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public Set getNews()
{
return this.news;
}
public void setNews(Set news)
{
this.news = news;
}
}
Code:
public class News implements java.io.Serializable
{
private Integer id;
private String headline;
private Date date;
private Set anbieter = new HashSet();
public News()
{
}
public News(String headline)
{
this.headline = headline;
}
public News(String headline, Date date)
{
this.headline = headline;
this.date = date;
}
public Integer getId()
{
return this.id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getHeadline()
{
return this.headline;
}
public void setHeadline(String headline)
{
this.headline = headline;
}
public Date getDate()
{
return this.date;
}
public void setDate(Date date)
{
this.date = date;
}
public Set getAnbieter()
{
return this.anbieter;
}
public void setAnbieter(Set anbieter)
{
this.anbieter = anbieter;
}
}
Code zum Einfügen:
Code:
public static void insert()
{
Session sess = null;
try
{
sess = HibernateUtil.getSessionFactory().openSession();;
Transaction tx = sess.beginTransaction();
News news = new News();
news.setHeadline("Zufallszahl: " + Math.random() * 50);
news.setDate(new Date());
Anbieter anbieter1 = new Anbieter("anbieter1");
anbieter1.getNews().add(news);
news.getAnbieter().add(anbieter1);
sess.saveOrUpdate(news);
sess.saveOrUpdate(anbieter1);
tx.commit();
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
finally
{
sess.close();
}
}
Ich benutze NetBeans 7.0 auf einem Windows XP Rechner