Problem beim Laden von Objekten, die von anderen Applikationen in eine DB eingefügt wurden

Michael6767

Mitglied
Hallo allerseits,

ich habe ein (Verständnis-)Problem bzgl. JPA/Hibernate.
Ich habe zwei Anwendungen. Die erste Anwendung erlaubt Kunden Bestellungen abzugeben und die zweite soll diese Information "live" anzeigen.
Die Datenbank sieht ungefähr so aus:
Master-Tabelle: Kunde
Detail-Tabelle: Bestellungen
Anwendung 1:
Der Kunde führt eine Bestellung aus. Diese Bestellung wird persistiert und kann auch in dieser Anwendung abgerufen werden.

Anwendung 2:
Wenn man den Kunden auswählt wird eine Abfrage ausgeführt, welche alle Bestellungen des Kunden zurückgeben soll. Leider bekomme ich aber nur die Bestellungen, die vor dem Start der Anwendung 2 bereits persistiert waren.

Frage: Wie bekomme ich die Anwendung 2 dazu, alle Bestellungen, die sich in der Datenbank befinden, zu laden?

Die Entität Orders (Bestellungen) besitzt ein Feld customer:
@ManyToOne
@JoinColumn(name="coustomerId")
private Customer customer;

An der grundsätzlichen Konfiguration kann es eigentlich nicht liegen, da ich ja ein Ergebnis erhalte. Leider halt unvollständig ...

Die Bestellungen werden folgendermaßen geladen:

Java:
public List<Order> listOrdersFromCustomer(String condition,
		String orderBy, Customer c) throws Exception {
	condition = "From Order as o Where o.customer = ?";
	Session session = SessionFactoryUtil.getInstance().getCurrentSession(); // Hibernate Session
	session.refresh( c ); // ich dachte, das hilft vielleicht. Leider nein.
	Query query = session.createQuery( condition).setEntity(0, c);
	return query.list();
}
Wie gesagt, das Ergebnis dieser Abfrage beinhaltet alle Bestellungen, die vor derm Start der Anwendung 2 bereits in der DB gespeichert waren.

Vielleicht kann mich jemand auf die richtige Spur setzen.

Gruß
Michael
 
Hi,

guck dir nochmal deine Anwendung1 an. Klingt so als ob die Datensätze nicht richtig persistiert werden.
Fehlt da vielleicht noch irgendwo ein "session.flush" oder der Abschluss einer Transaction?

Wenn die Datensätze wirklich richtig persistiert wären müssten die in der Query auch auftauchen.
Alternativ wird deine Query nur einmal ausgeführt und dir werden alte Ergebnisse angezeigt.

PS: Führ die Query doch mal mit nem SQL-Tool aus (SqlDeveloper, Console...)
 
Hallo gman,

danke für die Tipps. Ich weiß, dass die Daten korrekt persistiert werden, da ich mit dem MySQL-Query-Browser die Daten sofort angezeigt bekomme. Sorry, das hätte ich auch posten sollen.
Und die Abfrage wird auch wunschgemäß ausgeführt. Ich habe ein Programm mit 2 Listen (Master/Detail). Wenn ich da auf den gewünschten Kunden klicke, dann wird die Query tatsächlich ausgeführt (im Debug-Mode getestet) und liefert leider nicht den "Live"-Zustand der Datenbanktabelle Orders.

Vielleicht muss ein bestimmter Verbindungsparameter bei MySQL gesetzt werden um dies zu erreichen?

Gruß
Michael
 
Problem gelöst:

Das Problem war, dass ich eine "alte" Session, die beim Start der Anwendung über eine SessionFactory erzeugt wurde, benutzt habe. Dies wird so häufig in Tutorials gezeigt. In diesem Fall ist das eben problematisch. Bei solchen Live-Aktualisierungen ist also darauf zu achten, dass eine neue Session benutzt wird.

Gruß
Michael
 
Ich habe das gleiche Problem konnte ea aber bisher leider nicht lösen. Mein spring-beans.xml sieht wie folgt aus
[XML]<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="persistenceUnit" />
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- <property name="showSql" value="true" />-->
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
</bean>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<!-- Publishing session factory to be able view statistics -->
<bean id="sessionFactory" factory-bean="entityManagerFactory"
factory-method="getSessionFactory" />

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>[/XML]

Gibt es eine Property, bei der ich festlegen kann kann, das immer eine neue verwendet werden soll oder muss dies direkt in den DAO's geschehen?
 
Hallo bluer,

die Frage ist so etwas schwierig zu beantworten, da Du Deine DAO-Methoden nicht zeigst. Generell kann man aber sagen, dass Du die Abfrage ja über eine Session ausführen musst. Wenn Du diese Session mit Session.refresh() aktualisierst, dann solltest Du auch aktuelle Daten sehen. Das gilt im Übrigen auch bei mir. Es ist also nicht unbedingt notwendig, eine neue Session zu erzeugen.

Gruß
Michael
 

Neue Themen


Zurück
Oben