Archief - [PROG]JAVA in Netbeans IDE 5.0 probleem bij het maken van een insert functie.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Bubba

Legacy Member
Hoi,

Ik zit dus vast bij een stuk programmeer werk. Het is een project voor een VZW die sportkampen voor jongeren organiseert. Mijn probleem zit hem in het aanmaken / aanpassen van een aantal gegevens. Ik zal hier het voorbeeld zetten van het aanmaken van een nieuwe inschrijving maar ik heb nethetzelfde probleem bij het aanmaken van een kamp of een sportcentrum.

Hier is het stuk code van de Data Acces Page Inschrijving:

Code:
    public boolean maakInschrijving(Inschrijving inschrijving, Deelnemer deelnemer, Kamp kamp) {
        boolean resultaat = true;
        PreparedStatement stmt = null;
        try {
            stmt = connection.prepareStatement
                    ("INSERT INTO inschrijving, deelnemer, kamp VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            stmt.setInt(1, deelnemer.getId());
            stmt.setString(2, deelnemer.getNaam());
            stmt.setDate(3, (java.sql.Date) deelnemer.getGeboortedatum());
            stmt.setString(4, deelnemer.getGeslacht());
            stmt.setString(5, deelnemer.getStraat());
            stmt.setString(6, deelnemer.getHuisnummer());
            stmt.setString(7, deelnemer.getBus());
            stmt.setString(8, deelnemer.getPostcode());
            stmt.setString(9, deelnemer.getWoonplaats());
            stmt.setString(10, deelnemer.getTelefoon());
            stmt.setString(11, deelnemer.getGsm());
            stmt.setString(12, deelnemer.getEmail());
            stmt.setInt(13, kamp.getId());
            //insert kamp.sportcentrum
            //insert kamp.sporttak
            //stmt.setInt(14, kamp.getSportcentrum().getId());
            //stmt.setString(15, kamp.getSportcentrum().getNaam());
            //stmt.setString(16, kamp.getSportcentrum().getVerantwoordelijke());
            //stmt.setString(17, kamp.getSportcentrum().getStraat());
            //stmt.setString(18, kamp.getSportcentrum().getHuisnummer());
            //stmt.setString(19, kamp.getSportcentrum().getBus());
            //stmt.setString(20, kamp.getSportcentrum().getPostcode());
            //stmt.setString(21, kamp.getSportcentrum().getWoonplaats());
            //stmt.setString(22, kamp.getSportcentrum().getTelefoon());
            //stmt.setString(23, kamp.getSportcentrum().getEmail());
            //stmt.setInt(23, kamp.getSporttak().getId());
            //stmt.setString(24, kamp.getSporttak().getOmschrijving());
            stmt.setString(25, kamp.getNaam());
            stmt.setDate(26, (java.sql.Date) kamp.getBegindatum());
            stmt.setDate(27, (java.sql.Date) kamp.getEinddatum());
            stmt.setInt(28, kamp.getMingebjaar());
            stmt.setInt(29, kamp.getMaxgebjaar());
            stmt.setDouble(30, kamp.getPrijs());
            stmt.setInt(31, kamp.getAantalplaatsen());
            stmt.executeUpdate();
        } catch (Exception e) {
            resultaat = false;
        } finally {
            try {  if (stmt!=null)stmt.close();
            } catch(SQLException e){}
        }
        return resultaat;
    }

het is dus de bedoeling van een nieuwe inschrijving aan te maken. Normaal gezien redelijk simpel maar het probleem is dat inschrijving gegevens haalt uit 2 andere tabellen namelijk uit deelnemer en uit kamp.

Ik heb eerlijk gezegd geen flauw idee en heb zomaar even iets ingetypt om te laten zien. Zoals je kan zien staat het dan ook in commentaar erbij vermeld.

Iemand die misschien weet hoe je dit kan oplossen?

Ollie

Legacy Member
Deel je insert op in drie verschillende insert statements. Bijvoorbeeld (maar neem niet letterlijk over, is uit het hoofd geschreven):

Code:
public boolean maakInschrijving(Inschrijving inschrijving, Deelnemer deelnemer, Kamp kamp) {
	boolean result = false ;
	
	try {
		connection.setAutoCommit(false) ;
		
		// vervang ... door benodigde parameters en zet in juiste volgorde
		insertInschrijving(...) ;
		insertDeelnemer(...) ;
		insertKamp(...) ;
		
		connection.commit() ;
		result = true ;
	} catch (SQLException e) {
		e.printStackTrace(System.err) ;
		
		try {
			connection.rollback() ;
		} catch (SQLException e) {
			throw new RuntimeException("Failed to rollback") ;
		}
		
		throw new RuntimeException("Failed to makeInschrijving") ;
	} finally {
		try {
			connection.setAutoCommit(true) ;
		} catch (SQLException e) {
			throw new RuntimeException("Can't set auto commit to true") ;
		}
	}
	
	return result ;
}

Ik merk trouwens dat je je connection niet creeërt (DataSource.getConnection()) en closed in je method. Ik hoop dat je dat in een laag boven die maakInschrijving doet want Connections als variabelen zetten in classes en over verschillende methods heen gebruiken is geen goed idee.

EDIT: idealer zou natuurlijk zijn dat je maakInschrijving in een business object zet met de insertXXX methods in je Data Access Objects. Gebruik makende van het Spring framework kan je er declarative transaction management op los laten en dan moet je je geen bal aantrekken van setAutoCommit(), commit() en rollback().

Bubba

Legacy Member
Bedankt voor de hulp maar het is niet meer nodig.

Ik heb net gezien dat ik vertrokken ben met de verkeerde gegevens. :doh:

WHiSPy

Legacy Member
Ollie zei:
Deel je insert op in drie verschillende insert statements. Bijvoorbeeld (maar neem niet letterlijk over, is uit het hoofd geschreven):

Code:
public boolean maakInschrijving(Inschrijving inschrijving, Deelnemer deelnemer, Kamp kamp) {
	boolean result = false ;
	
	try {
		connection.setAutoCommit(false) ;
		
		// vervang ... door benodigde parameters en zet in juiste volgorde
		insertInschrijving(...) ;
		insertDeelnemer(...) ;
		insertKamp(...) ;
		
		connection.commit() ;
		result = true ;
	} catch (SQLException e) {
		e.printStackTrace(System.err) ;
		
		try {
			connection.rollback() ;
		} catch (SQLException e) {
			throw new RuntimeException("Failed to rollback") ;
		}
		
		throw new RuntimeException("Failed to makeInschrijving") ;
	} finally {
		try {
			connection.setAutoCommit(true) ;
		} catch (SQLException e) {
			throw new RuntimeException("Can't set auto commit to true") ;
		}
	}
	
	return result ;
}

Ik merk trouwens dat je je connection niet creeërt (DataSource.getConnection()) en closed in je method. Ik hoop dat je dat in een laag boven die maakInschrijving doet want Connections als variabelen zetten in classes en over verschillende methods heen gebruiken is geen goed idee.

EDIT: idealer zou natuurlijk zijn dat je maakInschrijving in een business object zet met de insertXXX methods in je Data Access Objects. Gebruik makende van het Spring framework kan je er declarative transaction management op los laten en dan moet je je geen bal aantrekken van setAutoCommit(), commit() en rollback().

- Schrijf heel de variable/class/methode-zooi aub in het Engels. Alles in het Nederlands makes baby Jezus cry. (but I don't know any Jebus!)
- Als je spring gaat promoten, geef dan ook mee dat ze beter eigenlijk gewoon de jdbctemplate gebruiken zodat ze die boilerplate code niet hoeven te schrijven. Maar ik vrees 'n beetje dat het hele spring-gedoe ook wel 'n deftige leercurve heeft voor mensen die aan 'n huis-tuin & keuken-projectje werken. Dan kan je beter zelf je templates/wrapper objecten gaan schrijven, maar die dingen mogen uiteraard ook niet doorspekt worden zodat ze te gebonden worden aan de applicatie zelf.
- Maak aub ook je eigen implementaties van runtime-exceptions. Algemene generic exceptions heeft niemand iets aan.

Ollie

Legacy Member
WHiSPy zei:
- Schrijf heel de variable/class/methode-zooi aub in het Engels. Alles in het Nederlands makes baby Jezus cry. (but I don't know any Jebus!)
- Als je spring gaat promoten, geef dan ook mee dat ze beter eigenlijk gewoon de jdbctemplate gebruiken zodat ze die boilerplate code niet hoeven te schrijven. Maar ik vrees 'n beetje dat het hele spring-gedoe ook wel 'n deftige leercurve heeft voor mensen die aan 'n huis-tuin & keuken-projectje werken. Dan kan je beter zelf je templates/wrapper objecten gaan schrijven, maar die dingen mogen uiteraard ook niet doorspekt worden zodat ze te gebonden worden aan de applicatie zelf.
- Maak aub ook je eigen implementaties van runtime-exceptions. Algemene generic exceptions heeft niemand iets aan.

En die return value staat daar te veel en ik gebruik printStackTrace ipv Log4J, geen ORM framework, etc blah blah blah...jongens toch.

Is het de bedoeling dat ik hier de perfecte applicatie schrijf of vlug vlug een concept toon dat de topic starter onmiddelijk kan gebruiken?

AcIdR3IgN

Legacy Member
hmm Bubba, lijkt me ZEER sterk op de JAVA project die we op school (KHK?) moeten maken voor les Java :) (verdacht? :p)

Maar goed, sport VZW it is ;)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan