Hibernate-Update Problem

7bkahnt

Mitglied
Grüsst euch,
ich habe ein denk ich recht einfaches Problem, zu dem ich gerade aber keine Lösung finde.
Ich möchte einen bestimmten Datensatz updaten.

Java:
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();

SString statement = "update Vor_tbspiel_t tbspiel set tbspiel.text255 = ?, tbspiel.zahl6=?, tbspiel.f_id_a_sb=? tbspiel.datum_a=? where tbspiel.id = ?";
				int updatedEntities = session.createQuery( statement )
				        .setString(0, text)
				        .setInteger(1,zahl)
				        .setInteger(2,usid)
                  //    	        .setString(3, zeit)
				        .setInteger(3, auswahlid)
				        .executeUpdate();
tr.commit();


Auf auswahlid steht die ID des vom Nutzer gewählten Datensatzes.
Wenn ich nur text und zahl update funktioniert es tadellos. Sobald ich aber noch einen dritten Wert updaten will kommt ein Fehler.
org.hibernate.QueryException: could not resolve property: f_id_a_sb of: db.Vor_tbspiel_t [update db.Vor_tbspiel_t tbspiel set tbspiel.text255 = ?, tbspiel.zahl6=?, tbspiel.f_id_a_sb=?, tbspiel.dat_a=? where tbspiel.id = ?]

Muss ich bei der querylanguage da irgendwas beachten, wenn ich mehr als 2 Werte updaten möchte?

EDIT:
Nun habe ich es mal nur mit zahl und usid probiert und es kommt dergleiche Fehler. Also liegt es doch nicht an der Anzahl der Updates.
Aber eigentlich ist alles richtig festgelegt in der Java-Klasse.
usid ist auch belegt, da ich es mir vorher sogar ausgeben lasse. Diese soll eben dann in die Spalte f_id_a_sb geschrieben werden.

Vor_tbspiel_t.java:
Java:
package db;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="vor_tbspiel_t")
public class Vor_tbspiel_t {
	
	private Integer id;
	private String text255;
	private Integer zahl6;
	private Integer f_id_a_sb;
	private String datum_a;
	private Integer f_id_c_sb;
	private String datum_c;
	private String sessionid;
	
	
	
	public Vor_tbspiel_t() {
	}
	@Id
	@GeneratedValue
	@Column(name="ID")
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	@Column(name="TEXT255")
	public String getText255() {
		return text255;
	}
	public void setText255(String text255) {
		this.text255 = text255;
	}
	@Column(name="ZAHL6")
	public Integer getZahl6() {
		return zahl6;
	}
	public void setZahl6(Integer zahl6) {
		this.zahl6 = zahl6;
	}
	
	@Column(name="F_ID_A_SB")
	public Integer getF_id_a_sb() {
		return f_id_a_sb;
	}
	public void setF_id_a_sb(Integer f_id_a_sb) {
		this.f_id_a_sb = f_id_a_sb;
	}
	@Column(name="DAT_A")
	public String getDatum_a() {
		return datum_a;
	}
	public void setDatum_a(String datum_a) {
		this.datum_a = datum_a;
	}
	
	@Column(name="F_ID_C_SB")
	public Integer getF_id_c_sb() {
		return f_id_c_sb;
	}
	public void setF_id_c_sb(Integer f_id_c_sb) {
		this.f_id_c_sb = f_id_c_sb;
	}
	
	@Column(name="DAT_C")
	public String getDatum_c() {
		return datum_c;
	}
	public void setDatum_c(String datum_c) {
		this.datum_c= datum_c;
	}
	
	@Column(name="SESSIONID")
	public String getSessionid() {
		return sessionid;
	}
	public void setSessionid(String sessionid) {
		this.sessionid = sessionid;
	}
}

Und die cfg.xml:
Java:
<session-factory>
	<property name="connection.username">system</property>
	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
	<property name="connection.password">adminadmin</property>
	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
	<property name="connection.useUnicode">true</property>
	<property name="connection.characterEncoding">UTF-8</property>
	<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

	<property name="c3p0.acquire_increment">1</property>
	<property name="c3p0.idle_test_period">27000</property>
	<property name="c3p0.max_size">10</property>
	<property name="c3p0.max_statements">0</property>
	<property name="c3p0.min_size">1</property>
	<property name="c3p0.timeout">100</property>
	
	<property name="show_sql">true</property>
    <mapping class="db.Vor_anwender_t" />
    <mapping class="db.Vor_tbspiel_t" />
</session-factory>

grüsse
 
Zuletzt bearbeitet:
Hi,
also als Erstes empfehle ich dir mal ein paar sprechende Variablennamen zu nehmen, das kann man ja absolut nicht lesen!
Warum nimmst du nicht die update-Funktion der Hibernate-Session und änderst die Werte nicht im Vor_tbspiel_t -Objekt?

Außerdem arbeitest du auf dem Objekt, es müßte dann heißen: tbspiel.F_ID_A=? usw.

Und warum heißt eigentlich die Variable f_id_a_sb und der getter/setter getF_ID_A()?

Grüße
Peter
 
Ja die Spaltennamen hat mein Chef (vom Praktikum) festgelegt und da hab ich die gleich als Variablennamen genommen. Insofern weiß ich schon was was ist.
Ich habe jetzt die getter und setter Methoden angepasst und diese auch in der Klasse richtig eingebunden (siehe oben) und jetzt funktioniert usid auch. Aber wenn ich jetzt die ersten 3 updaten möchte kommt wieder ein Fehler:
java.lang.IllegalArgumentException: node to traverse cannot be null!

Die update Funktion der Hibernate-Session hatte ich auch erst überlegt zu nehmen.
Das würde ja wie folgt aussehen.

Java:
Vor_tbspiel_t tbspiel = (Vor_tbspiel_t) session.get(Vor_tbspiel_t.class,auswahlid);
				tbspiel.setText255(text);
				tbspiel.setZahl6(zahl);
				tbspiel.setF_ID_A(usid);
				tbspiel.setDAT_A(zeit);

Aber da weiß ich eben nicht, wie ich where tbspiel.id =auswahlid festlegen kann.Vielleicht hast du einen Tipp?

grüsse
 
Hi,

Aber da weiß ich eben nicht, wie ich where tbspiel.id =auswahlid festlegen kann

aber das brauchst du doch garnicht mehr. Du hast doch schon das Objekt Vor_tbspiel_t mit der Id = auswahlid. Du brauchst jetzt nur noch ein session.update(tbspiel) machen. Vergiß MySQL, bei Hibernate arbeitest du auf den Objekten und mit der Id holst du dir das passende Objekt.

Insofern weiß ich schon was was ist
Du vielleicht, aber deine Kollegen, die das vielleicht irgendwann lesen müssen, wahrscheinlich nicht!

Grüße
Peter
 
Stimmt klar, war nen Denkfehler mit der Id. Ja doch so langsam wird mir Hibernate sympathisch :)
Okay jetzt funktionierts. Danke dir!
Die Variablen muss später übrigens keiner mehr nachvollziehen, weil das is nur nen Testprogramm. Jetzt gehts dann an die richtige Anwendung.

grüsse
 

Neue Beiträge

Zurück