Hibernate - aktualisieren von Objekten

Status
Nicht offen für weitere Antworten.

mmm

Mitglied
Hallo zusammen,

ich versuche, eine kleine Anwendung mit Hibernate, Spring und Struts zu machen.

Dafür habe ich mir folgendes Konzept überlegt:

- Der DB-Zugriff erfolgt über DAOs, die direkt mit Hibernate arbeiten:

z.B. UserDaoImpl.java enthält eine Methode getUserById(Integer id) mit folgendem Inhalt:

Code:
return (User) getHibernateTemplate().get(User.class, id);


- Zwischen DAO und Präsentationsschicht (Struts2) liegt eine Service-Schicht, die teilweise die DAO-Methoden "durchschleift", aber z.B. auch kompliziertere Dinge macht, bevor sie in die Datenbank (über die entsprechenden DAOs, die von Spring injected werden) geschrieben werden.

Nun habe ich ein - zumindest für mich - seltsames Problem:

In einer Struts-Action möchte ich Formulardaten in das User-Objekt schreiben. Dazu hole ich mir das entsprechende User-Objekt aus der Datenbank (über eine entsprechende Methode der Service-Schicht, welche wiederrum das UserDAO kontaktiert). Anschließend ändere ich die Property des geholten Objekts auf den neuen Wert, der vom Formular kommt.

Alles beendet sich normal, es gibt keine Exceptions.

Aber: Der Wert wurde nicht in die Datenbank geschrieben.

Ich habe irgendwo gelesen, dass das Objekt vermutlich detached ist, deswegen war mein zweiter Versuch, eine "attach"-Methode in der UserDAO zur Verfügung zu stellen:

Code:
public void attachUser(User u) {
   getHibernateTemplate().lock(u, LockMode.NONE);
}

Diese Methode habe ich wieder über die Service-Schicht durchgeschleift; wenn ich dann das geänderte User-Objekt übergebe, passiert allerdings (leider) auch ncihts.

Ich weiß echt nicht mehr weiter, es wäre super, wenn mir jemand von euch helfen würde!

Vielen dank und schöne Grüße,

mmm
 
S

SlaterB

Gast
bevor du dich mit noch mehr geschliffenen Schleifen verschleifst:
funktioniert denn überhaupt das Anlegen und Bearbeiten von Usern rein auf der Ebene der DB-Schicht?
öffnest und commitest du eine Transaktion?
 

mmm

Mitglied
Hallo SlaterB,

vielen Dank für deine schnelle Antwort. Ja, alle Elemente auf der DAO-Schicht sind mit JUnit-Tests geprüft (und ich habe manuell später in der DB nachgeschaut ;-))

Ich nutze keine Transaktionen, d.h. ich öffne keine im Code. Ich halte mich ziemlich nah an das Buch "Spring & Hibernate - eine praxisbezogene Einführung" (Hanser-Verlag,2007).

Ich habe in der web.xml noch folgenden Filter definiert:

Code:
<filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
</filter>

- leider reicht das nicht :-/
 

mmm

Mitglied
SlaterB hat gesagt.:
bevor du dich mit noch mehr geschliffenen Schleifen verschleifst:
funktioniert denn überhaupt das Anlegen und Bearbeiten von Usern rein auf der Ebene der DB-Schicht?
öffnest und commitest du eine Transaktion?

Anbei noch ein paar Code-Teile aus den betroffenen Klassen:

UserDAO:

Code:
public User getUserByUsername(String username) {
		List<User> l = getHibernateTemplate().find("FROM User u WHERE u.username = ?", username);
		if(l != null && l.size() >= 1) return l.get(0);
		else return null;
	}

	
	public Integer addUser(User u) {
		Integer r = -1;
		try {
			r = (Integer) getHibernateTemplate().save(u);
		} catch (Exception e) {
			r = -2; // username already exists
			// e.printStackTrace();
		}
		return r;
	
	}


In der JUnit-Testklasse hole ich ein Objekt und ändere es dann:
Code:
public void testChangeProperty() {
		User u = userDao.getUserByUsername("tester");
		assertEquals("Firstname ok?", u.getFirstname(), "Bella");
		// change firstname
		u.setFirstname("BellaHund");
		sessionFactory.getCurrentSession().flush();
		assertEquals("changes made in DB?", 1, jdbcTemplate.queryForInt("SELECT count(1) FROM User u WHERE u.Username = 'tester' AND u.Firstname = 'BellaHund'"));
		assertEquals("old data removed from DB?", 0, jdbcTemplate.queryForInt("SELECT count(1) FROM User u WHERE u.Username = 'tester' AND u.Firstname = 'Bella'"));
	}

wobei ich in der Methode onSetUpInTransaction() folgende Initialkonfiguration anlegen:

Code:
protected void onSetUpInTransaction() throws Exception {
		User u = new User();
		u.setUsername("tester");
		u.setFirstname("Bella");
		userDao.addUser(u);
		
		
		sessionFactory.getCurrentSession().flush();
		sessionFactory.getCurrentSession().clear();
		
	}

Das funktioniert - der Test wird grün :)

Leider löst das nicht mein anderes Problem.... :-(
 

mmm

Mitglied
Nachtrag:

Jetzt habe ich mal versucht, die Änderungen am User-Objekt mal in der Service-Klasse zu machen. D.h. ich erzeuge in der Struts-Action ein neues User-Objekt, befülle es mit den Daten aus dem Formular und mit der Id, die der entsprechende User-Eintrag in der Datenbank hat.

Die Service-Methode sieht wie folgt aus (u.id wurde korrekt gesetzt):

Code:
public void updateUser(User u) {
		User o = userDao.getUserById(u.getId());
		o.setFirstname(u.getFirstname());
	}

Leider führt das auch nicht dazu, dass die Änderung dauerhaft in der DB gespeichert wird (wobei, selbst wenn es so funktionieren würde, fände ich es schöner, wenn die Änderung der Properties gleich eine Änderung der Datenbank zur Folge hätte - ohne dieses zusätzliche Transport-User-Objekt u).

Ist das hier überhaupt noch das richtige Forum oder geht das schon zu weit in Richtung J2EE?

Danke und schöne Grüße,
mmm
 
S

SlaterB

Gast
cih frage mich nur, ob irgendjemand auch ein Transaktion anlegt,
kann aber nix konkretes weiter dazu beitragen
 

mmm

Mitglied
Hm, ich habe jetzt etwas rumgesucht und bin auf folgendes gestoßen:

1. Dieser OpenSessionInViewFilter hat wohl als default-Flush-Mode "Never" eingestellt - vermutlich wird dort also gar nicht geflush()t.

2. Ich verstehe den Sinn von Transaktionen in Spring nicht - brauche ich die wirklich? Bis jetzt habe ich für Spring also keine Transaktionsspezifischen Einträge in der applicationContext.xml definiert, sondern fahre ohne.

Kann es sein, dass es daran liegt?

Ich bin für jeden Hinweis (Links, Hilfestellungen, etc.) unendlich dankbar ;-)

Schöne Grüße,

mmm
 

ms

Top Contributor
In deinem JUnitTest, der offensichtlich von org.springframework.test.AbstractTransactionalSpringContextTests ableitet hast du serwohl eine Transaktion. Darum läuft der Test auch ohne Fehler.
Wenn du in deiner Applikation keine Transaktion hast gibts auch kein commit() und auch keine Daten in der Datenbank.

Der OpenSessionInViewFilter hat mit einer Transaktion selbst nichts zu tun. Er öffnet und schließt nur deine Session.
Man kann zwar die Transaktion an die Hibernatesession koppeln. In deinem Fall, da du den OpenSessionInViewFilter verwendest, macht das nicht viel Sinn, da man üblicherweise die Transaktionsklammern um die Servicemethoden, also der Serviceschicht hat.

Die Transaktionsschicht kannst du im Spring-Context relativ einfach hinzufügen.
Für deinen Fall sollte folgendes passen:

Code:
<bean id="userServiceTarget">
	<property name="irgendeinDao" ref="irgendeinDao"/>
</bean>

<bean id="userService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	<property name="transactionManager" ref="transactionManager" />
	<property name="target" ref="userServiceTarget" />
	<property name="transactionAttributes">
		<props>
			<prop key="*">PROPAGATION_REQUIRED</prop>

			<!-- Hier sind weitere Möglichkeiten die Transaktion zu steuern 
				<prop key="someOtherBusinessMethod">PROPAGATION_REQUIRES_NEW</prop>
				<prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
			-->
		</props>
	</property>
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" lazy-init="true">
	<property name="userTransactionName" value="UserTransaction"/>
</bean>

Da meine Applikationen auf einem JBoss laufen kann ich den JTA-Transactionmanager hier angeben, bei einem reinen Tomcat müßtest du den HibernateTransactionmanager hier verwenden.


ms
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Hibernate: Fremdschlüssel wird nicht erzeugt Datenbankprogrammierung 2
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
F GWT und Hibernate - gwt.dev.Compler not found Datenbankprogrammierung 3
M NestedTransaction- Exception in Hibernate Datenbankprogrammierung 15

Ähnliche Java Themen


Oben