Web- og serverprogrammering



Relaterede dokumenter
Videregående programmering i Java

Databaseadgang fra Java

Videregående programmering i Java

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU semester 05.januar 2007

Eksempel på en database: studenter, kurser, eksamener

Geografisk lokalisering i JSP

med Java og Linux Jacob Nordfalk Linuxforum 2004 Lørdag 6. marts Center for Videreuddannelse Ingeniørhøjskolen i København

Java-opgraderingskursus

En kort introduktion til JDBC

Rigtig SQL Programmering

Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:...

9.8 Kildekode. side 88. Pakke Klasse Sidenummer. fortsætter..

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Forskellige databaser

Oracle8i R8.1.5 JAVA. Oracle8i R Oracle8i Enterprise Edition Oracle8i R Oracle8i R Oracle8i R8.1.

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach 2002

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Web- og serverprogrammering

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Java web applikationer med Tomcat

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

Bilagsrapport til specialet Flash-light

Eksamens spørgsmål i Java HTML - DataBase 3. Semester (i)

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

BRP Kursusintroduktion og Java-oversigt

Views etc. Databaser

Dag 10 Flertrådet programmering

Webserverprogrammering

Videregående programmering i Java

Kursus navn: Indledende programmering Kursus nr

Løsning af møntproblemet

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Import af rekursivt (parent-child) hierarki i Palo

Anvendelse af metoder - Programmering

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML

SWC eksamens-spørgsmål. Oversigt

Web- og serverprogrammering

Hvordan vælger jeg dokumentprofilen?

Database optimering - Indeks

En Kort Introduktion til Oracle

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Introduktion til SQL queries

ODBC made easy på dansk (når bare man ved hvordan) Jesper Michelsen, Data warehouse & Analyse

Eksempel: Skat i år 2000

Præsentation af BSK regionens identity and access management platform

SQL for MySQL-begyndere

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Database programmerings tips

Har du ikke fået oprettet et afdelings-id og PIN-kode til udskrivning på husets printere bedes du tage kontakt til receptionen først:

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Skriftlig opgave. Designtanker i database-nære systemer

Bookie. IT-Universitetet i København. Grundlæggende Programmering. Eksamensprojekt. Forfattere: Sigrid Gyldenkærne Dalsgard Kasper Kronborg Isager

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse.

Databasesystemer. IT Universitetet i København 7. juni 2005

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 6

A11: Last Year s Exam

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Hvorfor skal vi bruge objekt orienteret databaser?

Videregående programmering i Java

SigmaT.

1 Domæne Design valg User Klassediagran 5

Videregående programmering i Java

Dag 10 Flertrådet programmering

Dokumentering af umbraco artikeleksport:

Løsning af skyline-problemet

Design Diaries.

Undtagelseshåndtering i C#

Fra idé til virkelig med Azure Mobile Services

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer

Netkatalog upload. Forord: Formål:

A Profile for Safety Critical Java

Abstrakte datatyper C#-version

Excel som database i ASP via ADO

Indholdsfortegnelse resultat- & kritikprogrammet.

Dansk Ride Forbund Stævnesystem 2 Installationsvejledning

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Database Implementering

Test af It-komponent

Geografisk lokalisering i ASP.NET

Udvikling af DOTNET applikationer til MicroStation i C#

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Databasesystemer. IT Universitetet i København 16. januar 2006

CV for Christian Plougmann Hag

Interaktionsudvikling

Optimering af dit trådløse net

1 Start installation. 2 Vælg Kør. Installation af Næsgaard Mark.NET og konvertering af data

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Transkript:

Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Web- og serverprogrammering Databasekommunikation - dag 7 Strategier til databaseadgang JDBC (Java DataBase Connectivity) Evt: JDBC RowSet Login-eksempel: Javabønne med JDBC JPA - Java Persistence API Læsning: WJSP 5, WJSP 9.5-9.7

JDBC databaseadgang Indlæse driveren Med Java under Windows følger en standard JDBC-ODBC-bro med, så man kan kontakte alle datakilder, der er defineret under ODBC: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Er det en anden database, skal man have en jar-fil med en driver fra producenten. Nyeste drivere kan findes på http://java.sun.com/jdbc/ Driver til en Oracle-database (hedder typisk classes12.zip): Class.forName("oracle.jdbc.driver.OracleDriver"); Driver til en MySQL-database (hentes på http://mysql.com): Class.forName("com.mysql.jdbc.Driver") Etablere forbindelsen Herefter kan man oprette forbindelsen med (for en ODBC-driver): Connection forb = DriverManager.getConnection("jdbc:odbc:datakilde1"); Datakildens navn (her "datakilde1") skal være defineret i Windows. Databasedrivere JDBC-drivere findes i fire typer: Type 1: JDBC-ODBC-broen. Langsomste og kun til Windows. Type 2: Drivere skrevet i C eller C++ til den specifikke platform (normalt de hurtigste). Type 3: Platformsuafhængig (ren Java-) driver med databaseuafhængig kommunikationsprotokol Type 4: Platformsuafhængig (ren Java-) driver skrevet til at kommunikere med en specifik database (mest udbredte og næsten lige så hurtig som type 2). Oracle-database: Connection forb = DriverManager.getConnection( "jdbc:oracle:thin:@ora.javabog.dk:1521:student","jacob","jacob"); MySQL-database: DriverManager.getConnection("jdbc:mysql:///jacob","root","xyz");

JDBC databaseadgang Kommunikere med databasen import java.sql.*; public class Databasekommunikation public static void main(string[] arg) throws Exception Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection forb = DriverManager.getConnection("jdbc:odbc:datakilde1"); Statement stmt = forb.createstatement(); // forsøg at slette tabel hvis den ikke findes opstår en fejl som fanges try stmt.executeupdate("drop table KUNDER"); catch (Exception e) stmt.executeupdate("create table KUNDER (NAVN varchar(32), KREDIT number)"); stmt.executeupdate("insert into KUNDER values('jacob', 1799)"); // indsæt data fra variabler String navn = "Hans"; double kredit = 500; stmt.executeupdate("insert into KUNDER(NAVN,KREDIT) values('"+navn+"', "+kredit+")"); // forespørgsler ResultSet rs = stmt.executequery("select NAVN, KREDIT from KUNDER"); while (rs.next()) navn = rs.getstring("navn"); kredit = rs.getdouble("kredit"); System.out.println(navn+" "+kredit); Jacob 1799.0 Brian 0.0 Hans 500.0

JDBC databaseadgang

Persistensproblemet Strategier til databaseadgang Rigtig mange muligheder, f.eks.: JDBC-kode blandet sammen med resten af koden JDBC-kode i dedikerede klasser JDBC RowSet - ResultSet, der også opdaterer databasen CachedRowSet - kan eksistere løsrevet fra databasen WebRowSet giver XML, der kan transformeres, f.eks. med XSLT (XSL style sheet), eller Javas XML-behandling EJB - Enterprise JavaBeans - ét serverobjekt pr. række JPA - Java Persistence AP - ét objekt pr. række Proprietære løsninger Giver mulighed for grafiske databasekomponenter Oracle JDeveloper ADF - Application Developer Framework Borland JBuilder: DataModule IBM WebSphere Studio

JDBC-ODBC-bro til Access-fil Eksempel: 1. Denne computer 2. Kontrolpanel 3. Administration 4. 6 5. 7

MySQL-database Installér MySQL Hent fra mysql.com test-database god i starten Grafiske værktøjer Installér JDBC-driver Connector/J fra mysql.com Læg JAR-fil i java/jre/lib/ext/ Kontakt test-database: Class.forName("com.mysql.jdbc.Driver"); Connection forb = DriverManager.getConnection("jdbc:mysql:///test");

Forberedte SQL-kommandoer import java.sql.*; public class ForberedtSQL public static void main(string[] arg) throws Exception Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql:///test"); // Forbered kommandoerne til databasen, f.eks. i starten af programmet: PreparedStatement indsætpstm = con.preparestatement( "INSERT INTO kunder (navn,kredit) VALUES(?,?)"); PreparedStatement hentpstm = con.preparestatement( "SELECT navn, kredit FROM kunder WHERE navn=?"); // under programudførelsen kan de forberedte kommandoer udføres mange gange: for (int i=0; i<100; i++) indsætpstm.setstring(1, "Brian"); indsætpstm.setint(2, i); indsætpstm.execute(); indsætpstm.setstring(1, "Hans' venner"); // bemærk ' i strengen indsætpstm.setint(2, 1042+i); indsætpstm.execute(); hentpstm.setstring(1, "Hans' venner"); ResultSet rs = hentpstm.executequery(); // bemærk ' i SQL forespørgslen // man løber igennem svaret som man plejer while (rs.next()) String navn = rs.getstring(1); double kredit = rs.getdouble(2); System.out.println(navn+" "+kredit);

Eksempel: Gæstebog Se WJSP, s. 98 Optimering Drivere Prepared statement Batch (kø) Stored procedures Forbindelsespujler

Samlede batch-opdateringer - venter ikke på svar fra DBMS mellem opdateringer - data-integritet...? import java.sql.*; public class Batchopdateringer public static void main(string[] arg) throws Exception Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql:///test"); PreparedStatement pstmt = con.preparestatement( "INSERT INTO kunder (navn,kredit) VALUES(?,?)"); pstmt.setstring(1, "Hans"); pstmt.setint(2, 142); pstmt.addbatch(); pstmt.setstring(1, "Grethe"); pstmt.setint(2, 242); pstmt.addbatch(); // send ændringer til databasen pstmt.executebatch();

Transaktioner import java.sql.*; public class UdenAutocommit public static void main(string[] arg) throws Exception Class.forName("oracle.jdbc.driver.OracleDriver"); Connection forb = DriverManager.getConnection( "jdbc:oracle:thin:@ora.javabog.dk:1521:student","jacob","jacob"); try forb.setautocommit(false); Statement stmt = forb.createstatement(); stmt.executeupdate("insert into KUNDER(NAVN,KREDIT) values('jacob', 17)"); stmt.executeupdate("insert into KUNDER(NAVN,KREDIT) values('brian', 0)"); // flere transaktioner... System.err.println("Alt gik godt, gør ændringerne forpligtigende"); forb.commit(); catch (Exception e) e.printstacktrace(); System.err.println("Noget gik galt! Annullerer ændringerne..."); forb.rollback(); finally // Husk at sætte auto commit tilbage, af hensyn til andre transaktioner forb.setautocommit(true);

Rydde op med finally Finally-blokke bliver altid udført, selv når undtagelsen ikke fanges, eller der hoppes ud af metoden på anden vis public void metode1() try... if (...) return; if (...) throw new IllegalArgumentException(...);... catch (NullPointerException e) System.out.println("Intern fejl:"); e.printstacktrace(); finally System.out.println("Dette bliver altid udført."); System.out.println("Slut på metode1()");

ResultSetMetaData rsmd = rs.getmetadata(); int antalkolonner Metadata= rsmd.getcolumncount(); System.out.println(); System.out.println(" " + titel + " ("+antalkolonner+" kolonner)"); // udskriv kolonnenavnene for (int i=1; i<=antalkolonner; i++) skrivformateret(rsmd.getcolumnname(i)); System.out.println(); // udskriv cellerne i hver række while (rs.next()) for (int i=1; i<=antalkolonner; i++) skrivformateret(""+rs.getstring(i)); System.out.println(); System.out.println(" "); public static void main(string[] arg) throws Exception Class.forName("oracle.jdbc.driver.OracleDriver"); Connection forb = DriverManager.getConnection( "jdbc:oracle:thin:@ora.javabog.dk:1521:student","jacob","jacob"); DatabaseMetaData dmd = forb.getmetadata(); System.out.println("DatabaseProductName = "+dmd.getdatabaseproductname()); System.out.println("DriverName = "+dmd.getdrivername()); System.out.println("MaxRowSize = "+dmd.getmaxrowsize()); ResultSet rs = dmd.gettables(null, "JANO", "%", null); udskriv("tabeller i databasen", rs); Statement stmt = forb.createstatement(); rs = stmt.executequery("select * from KUNDER"); udskriv("kunder", rs); public static void skrivformateret(string str) System.out.print(str); String KOL = " "; if (str.length()<kol.length()) System.out.print(KOL.substring(str.length()));

ResultSetMetaData rsmd = rs.getmetadata(); int antalkolonner Metadata = rsmd.getcolumncount(); System.out.println(); System.out.println(" " + titel + " ("+antalkolonner+" kolonner)"); // udskriv kolonnenavnene for (int i=1; i<=antalkolonner; i++) skrivformateret(rsmd.getcolumnname(i)); System.out.println(); // udskriv cellerne i hver række while (rs.next()) for (int i=1; i<=antalkolonner; i++) skrivformateret(""+rs.getstring(i)); System.out.println(); System.out.println(" "); DatabaseProductName = Oracle public static void main(string[] arg) throws Exception DriverName = Oracle JDBC driver Class.forName("oracle.jdbc.driver.OracleDriver"); MaxRowSize = 2000 Connection forb = DriverManager.getConnection( "jdbc:oracle:thin:@ora.javabog.dk:1521:student","jacob","jacob"); tabeller i databasen (5 kolonner) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE TABLE_REMARKS DatabaseMetaData null dmd = forb.getmetadata(); JANO KUNDER TABLE null System.out.println("DatabaseProductName = "+dmd.getdatabaseproductname()); null JANO PERSONER TABLE null System.out.println("DriverName = "+dmd.getdrivername()); System.out.println("MaxRowSize = "+dmd.getmaxrowsize()); ResultSet rs = dmd.gettables(null, kunder (2 kolonner) "JANO", "%", null); udskriv("tabeller NAVN i databasen", KREDIT rs); Jacob 1799 Statement Brian stmt = forb.createstatement(); 0 rs = stmt.executequery("select * from KUNDER"); udskriv("kunder", Hans rs); 500 public static void skrivformateret(string str) System.out.print(str); String KOL = " "; if (str.length()<kol.length()) System.out.print(KOL.substring(str.length()));

Opdatere og navigere i ResultSet De fleste ResultSet har metoder til at bevæge sig aktivt rundt i svaret og endda opdatere databasen gennem svaret. Det gøres med f.eks.: Statement stmt = con.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executequery("select NAVN, KREDIT from KUNDER"); Derefter kan man navigere rundt i ResultSet-objektet med f.eks.: rs.absolute(3); // går til 3. række i svaret (regnet fra 1 af) rs.previous(); // går en række tilbage (modsatte af next()) rs.first(); // går til starten af svaret (svarende til rs.absolute(1)) rs.relative(3); // går 3 rækker frem, dvs. til 4. række int r = rs.getrow();// giver hvilken række vi nu er i (her returneres 4) Man kan ændre i data med f.eks.: rs.updatestring("navn", "Jakob"); // ændrer kundens navn til Jakob rs.updaterow(); // opdaterer rækken i databasen rs.movetoinsertrow(); // flyt til speciel indsættelses række rs.updatestring("navn", "Søren"); // sæt navn rs.updatedouble("kredit", 1000); // sæt kredit rs.insertrow(); // indsæt rækken i databasen rs.movetocurrentrow(); // gå væk fra speciel indsættelsesrække Derudover findes cancelrowupdates(), der annullerer opdateringer i en række, deleterow(), der sletter den aktuelle række fra både svaret og databasen, refreshrow(), der opfrisker ResultSet-objektet med de nyeste data.

JDBC RowSet Oracle: A thin wrapper around ResultSet object to make a JDBC driver look like a JavaBeans component RowSet = et sæt rækker hentet fra databasen =ResultSet+oprindelse+ændringer RowSet-objekter giver mulighed ny arbejdsform Man behøver kun at spørge på data (f.eks. med SELECT) hvorefter man får et RowSet-objekt. Når man skal opdatere nogle rækker, slette eller oprette nye, opererer man blot det eksisterende RowSet-objekt Slut med at rode med INSERT-, DELETE- eller UPDATE-sætninger i SQL. Flere undertyper af RowSet JdbcRowSet =ResultSet+oprindelse+ændringer CachedRowSet =rækkerne er gemt i hukommelsen kan altså eksistere afbrudt fra databasen! Undertyper: FilteredRowSet og JoinRowSet WebRowSet =CachedRowSet repræsenteret som XML

JdbcRowSet import java.sql.*; import javax.sql.*; import javax.sql.rowset.*; import com.sun.rowset.*; // Bemærk: rowset.jar fra Sun skal være i CLASSPATH public class BenytJdbcRowSet public static void main(string[] arg) throws Exception Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql:///test"); JdbcRowSetImpl jrs = new JdbcRowSetImpl(con); // Lav forespørglen jrs.setcommand("select * FROM kunder WHERE navn =?"); jrs.setstring(1,"jacob"); jrs.execute(); // Udskriv resultatet while (jrs.next()) String navn = jrs.getstring("navn"); double kredit = jrs.getdouble("kredit"); System.out.println(navn+" "+kredit); Opdateringer? - skal indstille jrs Type og Concurrency - kun én table i SELECT! Data-integritet...?

CachedRowSet - off-line import java.sql.*; import javax.sql.*; import javax.sql.rowset.*; import com.sun.rowset.*; // Bemærk: rowset.jar fra Sun skal være i CLASSPATH public class BenytCachedRowSet public static void main(string[] arg) throws Exception Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql:///test"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * FROM kunder"); CachedRowSetImpl crs = new CachedRowSetImpl(); crs.populate(rs); rs.close(); // Opdatér første række i CachedRowSet objektet crs.first(); crs.updatedouble("kredit", 2000); crs.updaterow(); // Indsæt række crs.movetoinsertrow(); crs.updatestring("navn", "Poul Nyrup"); crs.updatedouble("kredit", 100000); crs.insertrow(); crs.movetocurrentrow(); // Opdatér data i databasen crs.seturl("jdbc:mysql:///test"); crs.setusername("root"); crs.setpassword(""); crs.acceptchanges();

WebRowSet off-line; XML-output import com.sun.rowset.*; // Bemærk: rowset.jar fra Sun skal være i CLASSPATH <?xml version="1.0"?> public class BenytWebRowSet <webrowset xmlns="http://java.sun.com/xml/ns/jdbc"...> <metadata> public static void main(string[] <column count>2</column count> arg) throws Exception <column definition> Class.forName("com.mysql.jdbc.Driver"); <column index>1</column index> Connection con = DriverManager.getConnection("jdbc:mysql:///test"); <column display size>32</column display size> Statement stmt = con.createstatement(); <column name>navn</column name> ResultSet rs = stmt.executequery("select <table name>kunder</table name> * FROM kunder"); <column type name>varchar</column type name> WebRowSetImpl wrs </column definition> = new WebRowSetImpl(); wrs.populate(rs); <column definition> rs.close(); <column index>2</column index> <column name>kredit</column name> // Generér XML <schema name></schema name> wrs.writexml(system.out); <table name>kunder</table name> <column type name>float</column type name> // Opdatér første </column definition> række i WebRowSet objektet wrs.first(); </metadata> wrs.updatedouble("kredit", <data> 3000); wrs.updaterow(); <currentrow> <columnvalue>jacob</columnvalue> // Indsæt række <columnvalue> 2000.0</columnValue> wrs.movetoinsertrow(); </currentrow> wrs.updatestring("navn", <currentrow> "Fogh"); wrs.updatedouble("kredit", <columnvalue>brian</columnvalue> 72); wrs.insertrow(); <columnvalue>0.0</columnvalue> wrs.movetocurrentrow(); </currentrow> <currentrow> // Generér XML der nu <columnvalue>poul også omfatter ændringerne Nyrup</columnValue> wrs.writexml(system.out); <columnvalue>100000.0</columnvalue> </currentrow> // Opdatér data </data> i databasen wrs.seturl("jdbc:mysql:///test"); </webrowset> wrs.setusername("root"); wrs.setpassword(""); wrs.acceptchanges();

Login og brugeroprettelse Eksempel på javabønne Bemærk: Serveren kan klare brugervalidering for dig

JPA / Java Persistence API Bibliotek holder styr på binding mellem database og klasser Annotations Typisk brug EntityManagerFactory emf = javax.persistence.persistence.createentity- @Entity @Table(name="user") public class User @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Basic(optional=false) @Column(name="id", nullable=false) private Integer id; @Column(name="username", length=30) private String username; @Column(name="password", length=50) private String password; ManagerFactory("ffproduction"); EntityManager emq = emf.createentitymanager(); Query allusersq = emq.createnativequery("select * from user",user.class); List<User> allusers = allusersq.getresultlist();

JPA / Java Persistence API Bibliotek holder styr på al opdatering Transaktioner EntityManager emenqueuejobs = emf.createentitymanager(); emenqueuejobs.gettransaction().begin(); job.setstate(ff.state_cancelled); emenqueuejobs.merge(job); emenqueuejobs.gettransaction().commit(); Opsætning (persistence.xml) <?xml version="1.0" encoding="utf-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="ffproduction" transaction-type="resource_local"> <provider>org.eclipse.persistence.jpa.persistenceprovider</provider> <class>ff.db.job</class> <class>ff.db.user</class> <properties> <property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.driver"/> <property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost/ff"/> <property name="eclipselink.jdbc.user" value="ff"/>

Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger du dele af værket i et nyt værk, skal de dele, der stammer fra dette værk, igen frigives under ÅDL Den fulde licens kan ses på http://www.sslug.dk/linuxbog/licens.html