Hallo!
Ich habe eine Applikation, die eine sehr grosse Datenmenge einliest und in eine DB speichert. Da diese derzeit über 2 Wochen läuft, bin ich dabei, diese zu optimieren und mir die Statements einzeln anzusehen. Was ich jetzt frage, ist höchstwahrscheinlich eine Anfängerfrage (bin ich ja auch), aber bis jetzt war mir das so nicht bewusst.
Hibernate version: hibernate: 3.2.5.ga
hibernate-commons-annotations: 3.3.0.ga
hibernate-annotations: 3.3.0.ga
Name and version of the database you are using:PostgreSQL 8.2
Classes:Ich habe drei Tabellen, eine Detailtabelle und zwei allgemeine Tabellen. Beim Speichern der Detailtabelle geht bei einer allgemeinen Tabelle alles gut, bei der zweiten wird ein zusätzliches Select generiert, welches ich vermeiden möchte. Anbei die Detailtabelle (ohne Getter/Setter und Datencolumns):
Code:
@Entity
@Table(name="LOG_ENTRY")
public class RegisterLogEntry
{
/**
* ID des Eintrages.
*/
@Id
@GeneratedValue(generator="uuid-gen")
@GenericGenerator(name="uuid-gen", strategy="uuid")
@Column(name="ID")
private String id;
/**
* ZMR-Transaktions-ID
*/
@ManyToOne
private Vorgang vorgang;
/**
* Log, in dem der Eintrag steht.
*/
@ManyToOne
private RegisterLog log;
...
Beide Verweise schauen gleich aus, der log-Eintrag wird in derselben Transaktion geschrieben, der vorgang-Eintrag ist schon existent.
The generated SQL (show_sql=true):Wenn ich
Code:
Vorgang vorgang = vorgangDao.find(transactionId);
aufrufe, wird der Vorgang erwartungsgemäß in der DB gesucht. Danach weise ich den Vorgang zu und speichere ihn:
Code:
entry.setVorgang(vorgang);
logEntryDao.persist(entry);
Beim persist wird nun erst folgendes Statement abgesetzt (ohne Datencolumns):
Code:
select
vorgang_.ZMR_TXID
from
public.VORGANG vorgang_
where
vorgang_.ZMR_TXID=?
Erst dann erfolgt das Insert:
Code:
insert
into
public.LOG_ENTRY
(CLASS, LINE_NUMBER, log_ID, MESSAGE, TIMESTAMP, vorgang_ZMR_TXID, ID)
values
(?, ?, ?, ?, ?, ?, ?)
Was mich stört, ist das SELECT vor dem Insert. Ich habe ja vorher ein find gemacht, was ja in einem SELECT resultiert (siehe auch
http://forum.hibernate.org/viewtopic.php?t=988983), also warum nochmal?
Wenn ich aber das persist gegen ein saveOrUpdate austausche, bekomme ich eine Excetion, weil ich den Vorgang nicht zugewiesen haben, obwohl ich dieses eigentlich getan habe.
Wäre schön, wenn mir das jemand erklären könnte. Irgendwas versteh ich da nicht.
vielen Dank Christian