Hibernate speichern - Null

Status
Nicht offen für weitere Antworten.

Fokus

Mitglied
Hallo Forum 🙂

Ich versuche mich derzeit ein bisschen in Hibernate 🙂

Dabei geht es um eine relativ einfache Anwendung:
Eine Finanzverwaltung hat mehrere Konten auf denen Geld ein und ausgänge gebucht werden können.

Jede Buchung hat natürlich genau ein Konto (also nicht die klassische Buchführung. Ganz einfach gehalten 😉 )

Nun gibt es zu den Buchungen und den Konten Pojo's und XML-Dateien.

Buchung.java
Java:
package objects;



import java.math.BigDecimal;

import java.sql.Timestamp;

import java.util.Date;



public class Buchung {



	private	int			id;

	private	Konto		konto;

	private	String		text;

	private	BigDecimal 	betrag;

	private	Timestamp	datum;

	private	boolean 	del;

	private	boolean 	storno;

	private	Date 		regelDatum;



		

	public int 			getId()						{ return id; }

	public Konto 		getKonto()					{ return konto;	}

	public String 		getText() 					{ return text; 	}

	public BigDecimal	getBetrag() 				{ return betrag; }

	public Timestamp	getDatum()					{ return datum; }

	public void 		setDatum(Timestamp datum) 	{ this.datum = datum; }

	public boolean 		isDel() 					{ return del; }

	public boolean 		isStorno() 					{ return storno; }

	public Date 		getRegelDatum() 			{ return regelDatum; }



	

	

	public void setId(			int id	) 			{ this.id = id; 	}

	public void setKonto(		Konto konto	) 		{ this.konto = konto; }

	public void setText(		String text	) 		{ this.text = text; }

	public void setBetrag(		BigDecimal betrag) 	{ this.betrag = betrag; }

	public void setDel(			boolean del) 		{ this.del = del; }

	public void setStorno(		boolean storno) 	{ this.storno = storno; }

	public void setRegelDatum(	Date regelDatum) 	{ this.regelDatum = regelDatum; }

		

	

}

Konto.java
Java:
package objects;

import java.awt.Color;
import java.util.HashSet;
import java.util.Set;


public class Konto {

	private	int 		   id;
	private	String 		   bez;
	private Color 		   farbe;
	private Set<Buchung>   buchung = new HashSet<Buchung>();

	
	
	public int 				getId() 			{ return id; }
	public String 			getBez() 			{ return bez; }
	public Color 			getFarbe()			{ return farbe; }
	public Set<Buchung>		getBuchung()     	{ return buchung; }

	
	public void setId( 		int id ) 				 { this.id = id; }
	public void setBez( 	String bez) 			 { this.bez = bez; }
	public void setFarbe( 	Color farbe) 			 { this.farbe = farbe; }
	public void setBuchung(Set<Buchung> buchung) { this.buchung = buchung; }
	
	
}


Buchung.hbm.xml
[xml]
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="objects.Buchung" table="BUCHUNG">
<id name="id" column="ID" type="integer">
<generator class="native"/>
</id>
<property name="text" column="TEXT" type="string" not-null="true"/>
<property name="betrag" column="BETRAG" type="big_decimal"/>
<property name="datum" column="DATUM" type="timestamp"/>
<property name="regelDatum" column="REGEL_DATUM" type="date" not-null="true"/>
<property name="del" column="DELETE" type="boolean"/>
<property name="storno" column="STORNO" type="boolean"/>

<many-to-one name="konto" column="ID_KONTO" class="objects.Konto"/>

</class>
</hibernate-mapping>

[/xml]

Konto.hbm.xml
[xml]
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="objects.Konto" table="KONTO">
<id name="id" column="ID" type="integer">
<generator class="native"/>
</id>
<property name="bez" column="BEZ" type="string" not-null="true"/>
<property name="farbe" column="FARBE" type="java.awt.Color"/>


<set name="buchung" cascade="all" lazy="true">
<key column="ID_KONTO"/>
<one-to-many class="objects.Buchung"/>
</set>

</class>
</hibernate-mapping>

[/xml]

So, nun versuche ich ein Konto anzulegen:
Java:
Konto kto = new Konto();
			kto.setBez("Schule");
			kto.setFarbe(Color.black);
			kto.setId(1);
			
			
			session = InitSessionFactory.getInstance()
	         .getCurrentSession();

		     tx = session.beginTransaction();

		     session.save(kto);
		     tx.commit();

Das ganze wird natürlich noch etwas ausgelagert, dient nur zu Testzwecken.
Wenn ich mir das ganze ausgeben lasse (hab dafür ne Methode geschrieben) gibt er auch brav alles aus.

Nun Versuche ich eine Buchung durchzuführen:
Java:
	Buchung bg = new Buchung();
			bg.setId(1);
			bg.setBetrag(new BigDecimal(12.0));
			bg.setDatum(new Timestamp(12345));
			bg.setRegelDatum(null);
			bg.setStorno(false);
			bg.setText("tesbuchung");
			bg.setDel(false);
			bg.setKonto(KontenControler.getKontoById(1));
			
			
			BuchungsControler.save(bg);

Die Methode save ist static.
Prinzipiell steht in ihr das drine was ich oben beim Konto schon gemacht habe, nur mit etwas mehr exception handling.

Nun um zum Ende zu kommen: Das geht nicht 😉
Als Exception-Message erhalte ich "null".

Hab ich da irgendwas falsch verknüpft?
Warum funktioniert das so nciht?
Danke für eure Hilfe! 🙂
 
Tu dir selbst einen gefallen und :
1. Nutze die moderne Variante, mit Annotations, anstatt XML Dateien
2. Benutzte eine Java konforme Formatierung (COBOL war gestern 😉 )
3. Setze nicht die ID selber
4. Gib uns den ganze Exception Stacktrace
5. Fang mit kleineren Übungsbeispielen an, die weniger verwirrend sind
 
Hi 🙂

Mit den Annotations gebe ich dir recht, dennoch wollte ich beides mal ausprobiert haben 😉

Was hast du gegen die Formatierung einzuwenden?
Weil ich die getter und setter in einer Zeile schreibe?
Diese art der Formatierung benutze ich nur bei den getter/settern, finde sie aber auch für diesen Anwendungsfall vollkommen ausreichend.

Stimmt, die ID müsste ich auch nicht selber setzen. War auch nur n Test 🙂


Narf.. sorry... hätte ihn mir mal ausgeben lassen sollen.
Fehler gefunden >.<
Null war für das RegelDatum kein korrekter wert.
 
Was hast du gegen die Formatierung einzuwenden?
Weil ich die getter und setter in einer Zeile schreibe?
Diese art der Formatierung benutze ich nur bei den getter/settern, finde sie aber auch für diesen Anwendungsfall vollkommen ausreichend.
Diese Art der Formatierung stammt noch aus COBOL und PL1 Zeiten, hat nix in Java Quellcode verloren:
Java:
    private int         id;
 
    private Konto       konto;
 
    private String      text;
 
    private BigDecimal  betrag;
 
    private Timestamp   datum;
 
    private boolean     del;
 
    private boolean     storno;
 
    private Date        regelDatum;
So sollte das sein:
Java:
    private int id;
    private Konto konto;
    private String text;
    private BigDecimal betrag;
    private Timestamp datum;
    private boolean del;
    private boolean storno;
    private Date regelDatum;
Wenn die Liste der Variablen zu lang wird und dadurch unübersichtlich, ist das ein gutes Zeichen dass da eine neue Klasse drinnsteckt und auszubrechen versucht 😉
 
Diese Art der Formatierung stammt noch aus COBOL und PL1 Zeiten, hat nix in Java Quellcode verloren:
Java:
    private int         id;
 
    private Konto       konto;
 
    private String      text;
 
    private BigDecimal  betrag;
 
    private Timestamp   datum;
 
    private boolean     del;
 
    private boolean     storno;
 
    private Date        regelDatum;
So sollte das sein:
Java:
    private int id;
    private Konto konto;
    private String text;
    private BigDecimal betrag;
    private Timestamp datum;
    private boolean del;
    private boolean storno;
    private Date regelDatum;
Wenn die Liste der Variablen zu lang wird und dadurch unübersichtlich, ist das ein gutes Zeichen dass da eine neue Klasse drinnsteckt und auszubrechen versucht 😉


Ach das meintest du 🙂
Die Formatierung ist irgendwie beim kopieren hobs gegangen.
In echt sind die zusammengerückt bzw. ohne freie zeile 😉

Hatte nur keine Lust es hier noch mal zu ändern, sry 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben