subota, 28. siječnja 2012.

Hibernate i Spring MVC integracija

Napokon! Kažem ja. Napokon malo zabavniji dio cijele ove priče. Napokon ću se dotaknuti teme hibernatea i spring mvc-a, ili kako mi je netko nedavno rekao - to je pod mus!
Hibernate je briljantan ORM, Spring MVC je briljantan framework za web i šta nalaže logika - da se to dvoje spoje. I to rade super, štoviše jedno drugoga nadopunjavaju.

Treba od nekud početi. Zašto uopće sve to? Ako niste spavali zadnjih 10.godina, trenutno je vrlo teško naći web stranicu koja svoj sadržaj ne sprema u bazu podataka. Naravno iznimke postoje i uvijek će ih biti, ali ako generaliziramo, ne znam tko više uopće odabire obične HTML stranice? Odgovor je vrlo lak - moderni hrvatski "biznismen" koji je dao nešto novaca susjedovom malom da mu napravi web stranicu za njegov "biznis". Ali čak i svaki napredniji "susjedov mali" bira bazu kao osnovu za spremanje podataka. Razlog je jednostavan - lakše je! Podatci su dostupni zauvijek, ti podatci se mogu pretraživati, raditi nešto s njima, a da ne pričam koliko je lako dodavanje novih sadržaja kad se ima iole dobar cms. Imajući sve to u vidu, vrijeme je da se vratim na naslov posta.

Ima nekoliko načina na koji se može naučiti ova tema, pa ću i nabrojati nekoliko:
  • Službena dokumentacija Spring frameworka (http://static.springsource.org/spring/docs/2.5.x/reference/orm.html)
  • Tutrorijali na webu (linkovi u daljnjem tekstu)
  • Pisana riječ u obliku knjige - Spring Persistence with Hiberante  (http://www.amazon.com/Spring-Persistence-Hibernate-Beginning-Tepper/dp/1430226323)
Napisani redoslijed nije slučajan, smatram da je to najbolji način za naučiti. Službenu dokumentaciju obavezno pročitajte ali nemojte previše ni pokušavati shvatiti iz nje. Je, super je napisana i sve to stoji ali pokušavati sve to zapamtiti - ne vidim smisla. Zato pročitajte dokumentaciju, neki važniji pojmovi će vam ostati u glavi, što je i najvažnije i pređite na tutorijale. Nema smisla raditi tutorijale dok ne prođete dokumentaciju jer neće znati o čemu se radi. A nakon što prođete tutorijale vratite se još jednom na dokumentaciju i sve će vam sjesti na mjesto - vjerujte me.
I dolazimo do knjige. (moj veliki uzdah - brz pretjerivanja!) Cijenim trud autora, ali nikako ni pod koji slučajem nemojte pokušati naučiti ovu temu preko ove knjige tj. nemojte napraviti istu pogrešku kao ja. U životu nisam našao knjigu koja ima više bugova. Skidanjem zipa sa službene stranice knjige i pokušavanje pokretanja builda na istim projektom je urodilo plodom od 63 errora?!? Čovjek bi pomislio da ako nešto prodaješ da ćeš i stajati iza toga. Istina za volju, nisu oni krivi. Kad su tiskali knjigu url od mavenovog repozitorija je bio drugačiji, ali tko se može sjetiti da to provjeri godinu dana kasnije? Malo traženja po googlu mi je dalo riješenje, ali to je samo vrh sante errora u knjizi.
Premda knjiga nije za početnika i nakon što se se uhvatili u koštac sa temom nemojte raditi primjere iz knjige. Knjigu uzmite kao lagano štivo gdje ćete vidjeti neke principe kako se nešto radi. Što se toga tiče knjiga ima neprocjenjivo znanje za prenijeti čitaocu.

I dolazimo do tutorijala, ruku na srce, od njih ćete najviše naučiti. Dati ću 2 linka na 2 turorijala a na vama je da odlučite koji vam se više sviđa. Napominjem da postoje još tutorijala na web, ali ja vam predlažem one koje sam ja prošao i što je važnije - znam da rade. Pošto svaki nudi čitatelju oduzimanje života na jedno minimalno sat vremena, ako ne i više, nema smisla raditi nešto što neće raditi ili što vas uči krivo.
Pa da dam i linkove:
  1. http://viralpatel.net/blogs/2010/11/spring3-mvc-hibernate-maven-tutorial-eclipse-example.html
  2. http://krams915.blogspot.com/2011/01/spring-mvc-3-hibernate-annotations.html
Nisu isti ali uče istu stvar na 2 načina. Redoslijed ostavljam vama, ali pojasnit ću što vam svako donosi/odnosi. Oba tutorijala se zasnivaju na MySQL bazi podataka, ali možete odabrati bilo koju.

Virapatel - ovo je ujedno i moj prvi tutotorial na koji sam naišao da radi. Što nije mala stvar. Treba imati na umu da je ovaj tutorial odrađen pomoću Mavena. Ovaj tutorial bi nazvao "lakšim" tj. napraviti ćete CRD dijelova od CRUD aplikacije. Naime u primjeru nije napravljen dio za editiranje zapisa. Druga stvar koja ga čini "lakšim" je da je kod rascijepkan u više klasa i na prvi pogleda samim time lakši za čitanje. Ali u drugom primjeru ćete vidjeti da je ovo duži način i da se sve može odraditi u manje linija koda. Glavni nedostatak je što nema komentara u kodu.
Skinite primjer, pokušajte pratiti i prepisati kod i pokušajte shvatiti kako cijela stvar radi. I zatim pređite na drugi tutorial.

Krams - koliko je ovaj tutorial dobar govori činjenica da Spring framework daje ovaj tutorial na svojim službenim stranicama kao tutorial za naučiti integraciju hiberante i springa. Još jedna stvar koja mu ide u prilog je da je nakon uočenih pogrešaka u kodu, autor je isti popravio na webu ali i u kodu te ponovni zip projekta stavio na web. Mogli bi se ugledati na njega momci koji pišu knjige na istu temu :)
Sad da kažem zašto je ovaj tutorial dobar: dobro objašnjen, hrpa komentara tako da kad gledate kod jasno vam je šta je šta. Ovaj tutorijal nudi i editiranje zapisa, tako da imate sve dijelove CRUD aplikacije.
Kada su nabrojane prednosti dolaze ne red nedostatci: nema ih! Dobro uvijek se može naći nešto, pa ako moram birati onda ću kao nedostatak navesti upotrebu loggera. S jedne strane je super jer daje priliku pregledavanja logova na serveru, a da s druge strane je to nedostatak jer uz sve silne komentare dodavanje loggera i komentara za njih kod je prenatrpan. Kad sam prolazio kod, brisao sam logger i komentare da vidim samo kod. Ali to sam ja.

Naravno jedna stvar na koju treba imati na umu je da oba primjera koriste MySQL bazu podataka, tako da ako hoćete koristiti neku drugu potrebno je napraviti promjene u jdbc.properties datoteki za Virapatel, te spring.properties datoteci za Krams. Ne zaboravite napraviti baze u MySQL-u pod imenima koja su navedena u tim properties datotekama, te ne zaboravite unjeti svoj username i password  za root  vašeg MySQL. Ako vam primjeri koje skinete ne budu radili onda niste napravili ove korake koje sam zadnje opisao.
S time svime na umu, sretno! Mislim da ću uskoro i ja dati neki praktičniji primjer ovoj temi, a do tada prođite ova dva tutotorijala i dokumentaciju.

subota, 21. siječnja 2012.

Lista Hibernate anotacija

Nešto sinoć surfam bespućima internetskih valova i kad mi na um nešto padne. Ne nije knjiga s police, nego ideja. Bacim se u pretragu, te potvrdim ono što sam i mislio. Na netu ne postoji (barem ja nisam mogao naći) listu hibernate anotacija. Samo onako prosta lista gdje s jedne strane su anotacija, a s druge kratko objašnjenje anotacije. Čak, što me i začudilo, ne postoji ništa slično ni na RefCardz?!? Najbliže što se tome može naći je na jbossovoj dokumentaciji o hiberanteu u ovom formatu:
http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

Ali to nije ono što ja želim. Samo kada vidim scrollbar koliko je mršav u gornjem desnom uglu - muka mi je. To definitivno nije ono što ja želim i trebam. Meni treba lista anotacija (bez primjera primjenjivanja istih) kada nešto radim da bacim pogled u nadi da mi dođe inspiracija kako nešto napraviti.
Pogledao sam i knjigu Hibernate Recepies, A Problem-Solution-Approach koju imam. Ni tamo ne postoji ništa takvo, možda sam i naivan što sam išao i gledati kad naslov kaže kakva je knjiga i s kojim pristupom obrađuju teme. Ali da ne bude - nismo znali. Pa evo da i ja dodam koji centimetar znanja u metre valova u bespuću interneta.
Napominjem da neću stavljati anotacije za Hibernate Search i ako uspijem za Cashing. To su područja koja su nauke same za sebe i mogli bi se pisati blogovi, knjige i sl. samo za njih. Pa da počnem:

  • @Entity - osnovna antacija kojom označavamo klasu koju želimo mapiratu u bazu
  • @Id - uz entity minimum potreban za mapiranje klase. Označava primarni ključ
  • @GeneratedValue - automatska inkrementacija id-a
  • @Table - služi za definiranje imena tablice, kataloga i scheme za vašu klasu
  • @Version - dodavanje "verzije" u dodatnu kolonu radi uspoređivanja kontaktirajućih updateva 
  • @Transient - po defaultu sva polja u klasi će biti mapirana u bazi, ako neko polje ne želimo mapirati koristimo ovu anotaciju
  •  @Lob - po defaultu npr. za String Hibernate će pretvoriti to u bazi u VarChar s dužinom od 255 znakova, tako da je Lob oznaka za tkz. velike oznake. 
  • @Embeddable - umetanje i spajanje komponenti u klasu
  • @OneToOne - mapiranje jedan naprama jedan
  • @OneToMany - mapiranje jedna naprema više
  • @ManyToMany - mapiranje više naprema više
  • @JoinColumns - na kojoj osnovi će se vršiti mapiranje
  • @PrimaryKeyColumn i @PrimaryKeyColumns - definiraju primarni ključ subklasa
  • @SecondaryTable - mapiranje klase u nekoliko tablica
  • @Cashable - oznaka da ćemo koristiti cashing u entitiju
  • @NamedQuery i @NamedQueries - stvaranje upita (ne znam kako da to prevedem na Hr) - stvaranje named queries
  • @NotNull - ne dopuštanje null vrijednosti
  • @Size.max - definiranje veličine polja
  • @Min, @Max - definiranje raspona
Naravno ovo nisu sve anotacije, niti se trudim ih sve napisati. Neke je jednostavno bez primjera ili poviše rečenica nije lako opisati. Npr. ne znam kako da prevedem named query osim imenovanog upita?!? Ujedino sam i dobio ideju za neki budući post - izgubljeni u prijevodu, koliko se "prevođenjem" programerskih izraza gubi u prijevodu. Za sada toliko, s vremenom proširit ću ovaj popis.

četvrtak, 19. siječnja 2012.

Validacija?

Validacija - što je to u uopće i zašto nam treba? Kako je kvalitetno napraviti? I tako dalje i tako dalje.... o ovim potpitanjima bi se dalo raspravljati. Kao i sve malo bolje/važnije stvari u programiranju postoji nekoliko načina kako se može napraviti validacija. Na programeru je da odebere svoj "otrov", ja ću navesti načine koje ja znam i umijem:
  1. Java Script validacija - znači dobri stari js
  2. moderniji pristup je pomoću jQuery-a tj. Do more write less pristupom
  3. najnovije čudo "tehnike" HTML5 i svog konja za utrku ima
  4. Spring naravno nije bez aduta
  5. i ako koristite Hibernate i on ima svog asa u rukavu
Sve je to lijepo i krasno ali treba se odlučiti za jedan pristup i napraviti ga. Sad je pitanje koji??? I tu nastaje dilema koja će razdvojiti dječake od muškaraca ili kako je govorila vještica iz popularne tv igrice Hugo - izaberi jedan broj sigurno ćeš pogriješiti!
Svaka od navedenih metoda nudi svoje nedostatke i prednosti. Navest ću neke od njih. Naravno Java Script će raditi samo ako je js omogućen u browseru, ali ni to nije bez lijeka - jednostavna poruka se da ispisati ako je kojim slučajem napravio disable js u svom browseru (mislim da 90% korisnika ni ne znam kako se ovo radi). Ne znanje korisnika nekad može biti velika prednost. Ali budimo realni pisanje validacije u običnom js nije baš najlakši posao na svijetu. Ako se baš odlučite na js pristup možda je ipak jQuery put kojim bi se trebali uputiti. Premda jQuery ne smatra validaciju kao primarnu djelatnost, ali zato je nudi kao plug in. Mali pogled na službenu dokumentaciju će zadovoljiti i najizbirljivije (http://docs.jquery.com/Plugins/Validation). Ako vam to ne odgovara probajte više infa naći ovjde: http://speckyboy.com/2009/12/17/10-useful-jquery-form-validation-techniques-and-tutorials-2/

Sada dolazimo do html dijela. Potez da HTML5 uključi validaciju je genijalni potez. Premda još uvijek postoje ljudi koji koriste stare verzije browsera koji ne podržavaju HTML5, ne smije se potpuno oslanjati na nju. Uvijek treba imati na umu da se nađe onaj jedan! A pošto je internet globalno selo s najviše stanovnika taj jedan se vrlo lako multiplicira na nekoliko stotina. Nekoliko stotina (a i manje nije ništa bolje) je dovoljno da napravi podosta štete vašoj savršenoj isplaniranoj aplikaciji/bazi... Ono što ide ovom načinu validacije u prilog je vrijeme! S vremenom neće biti browsera na netu koji ne podržava HTML5 tj. i oni ljudi koji su imali prastare verzije firefoxa (moja tetka), IE (verzija koja je došla sa windowsima)... će biti zamijenjena nekom novijom. Plus HTML5 se za razliku od js ne može isključiti :-)

E sada je na redu više "Java" dio validacije. Spring ima jako dobrog konja za utrku, po meni i najboljeg, ako se pravilo odradi. Pošto je Spring vrlo naklon lokalizaciji pa sve naše labele možemo staviti u .properties fileove, tamo možemo i sve moguće erorre u validaciji staviti u jedan takav file i naravno u nekoliko svjetskih jezika. Taj dio je jako važan! Inače, ako se ovo ne napravi, validacija će raditi ali će korisnik dobiti jako ružan error ispisan crvenim slovima. Ali ako errore stavimo u propeties file onda dobivamo validaciju jednaku onoj navedenim u prethodnim koracima. Veliki plus ovoj validaciji je da se također vrlo lako napravi i reprezentacija unesenih podataka. Za one koji ne znaju reprezentacija je kada korisnik nešto unese, klikne na submit i recimo ima 4 točna unešena polja od 5, ispravni podatci će mu ostati dok kod krivog unešenog će dobiti ispisani error. Mislim da je korist i više nego očigledna.

Zadnji, a ujednio i zadnji dio obrane je hibernateova validacija. Ovo je više kao nekakav "good practice" nego potreba. Stavljanje anotacije @NOT NULL, određivanje dužine polja itd... Samim time ako kojim slučajem spring ne odradi svoj dio imamo još jednu razine obrane. Ovaj dio uvijek obavezno radite radi sebe. Učite se raditi pravilno, a ako kojim slučajem spring, js, html5 validacija zakaže imate još nešto što neće.

I nakon cijele ove priče opet počinjemo od početnog pitanja - koju odabrati? Moj savijet je odaberite dve ako možete, više od toga vam ne treba jer u protivnom samo si radite višak posla bez efekta. Ako koristite hiberante, obavezno koristite njegovu validaciju plus još jednu po vašem odabiru. Ako ne koristite orm, odaberite one dve koje smatrate da možete dobro provesti u praksi. Naravno treba procijeniti kolika vam je i važnost podataka koji vam se unose. Koliko je šteta ako se unesu krivo itd. ako nije neka velika vrijednost, jedna je i više nego dovoljna. Uglavnom odlučite sami. Pogledajte koje uopće mogu zajedno raditi. Za Hiberante i Spring govorim iz iskustva i prema meni je najbolja kombinacija. U velikoj većini jedna validacija je sasvim dovoljna.

utorak, 17. siječnja 2012.

Dobivanje JSON-a u Spring MVC-u

Ovo je jako važna tema i nadogradnja u Spring MVC-u. Spring MVC ima puno prednosti, a pored jednostavnog renderiranja alternativnih pogleda tipa pdf, vraćanje JSON-a je po meni sljedeća najveća prednost.

Prije verzije 3 Springa ovaj cijeli postupak je bio dosta kompliciraniji, ali sada je čisti "mačji kašalj". Dovoljna je samo jedna anotacija - @ResponseBody. Točniji primjer ću napraviti malo kasnije, a prije toga ću navesti šta nam je sve potrebno da bi "upogonili" cijelu stvar.

Ovu divnu stvar nam je omogućio Jackson (http://jackson.codehaus.org/). Jason je java json parser... Najbolje je otići na njihovu stranicu i vidjeti cijelo objašnjenje. Uglavnom ako nećete koristiti Maven onda obavezno odite u download dio i skinute jar i dodajte ga u build path.
Ako koristite Maven i njegove zavisnosti onda u pom dodajte sljedeću zavisnost:

<dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-mapper-asl</artifactId>
          <version>1.7.1.</version>
</dependency>

Naravno, verzija zavisi o verziji Jacksona koji ćete koristiti. Šta vam točno koja verzija donosi/odnosi pogledajte na njihovoj službenoj stranici.

Sada imamo sve preduvjete za početak, još nam samo preostaje dodati samo anotaciju @ResponseBody. A to se radi na ovaj način.
  • u metodi od koje želimo dobiti json dodamo @ResponseBody anotaciju
  • u jsp ili html stranici dohvatimo dobiveni json
Pravilo kojeg se trebamo pridržavati kod anotacije je da anotaciju @ResponseBody dodamo iza tipa pristupa metode (privat, public...) a prije vrste metode. Naravno ovu anotaciju stavljamo u naš kontroler. Ono što stavimo u naš return će biti sadržano u našem json-u. I to je to! Vrlo jednostavno.

Na netu sam našao dva super primjera na ovu temu. Jedan koristi Maven, a drugi ne ali je zato kompliciraniji.
Primjer koji koristi Maven:
http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/
Napredniji primjer:
http://krams915.blogspot.com/2011/01/spring-mvc-3-and-jquery-integration.html
 

četvrtak, 12. siječnja 2012.

Hibernate - up and running

Vrijeme je da posvetim malo pažnje Hibernatu. Inače smatram da treba dignuti spomenik osobi koja je došla uopće na ideju da napravi ORM. Mislim da osoba koja je pokušala se povezati na bazu u bilo kojem jeziku jednom kad upozna ORM, se ne vraća se nazad. Odnosno kao što sam ja rekao Once you go ORM, you never go back :)

JDBC je super stvar, ali u usporedbi sa bilo kojim ORM-om (MyBatis, Hibernate...), JDBC gubi i to za puno. Samo kada se upoređuje gdje sve kod klasičnog povezivanja putem JDBC-a gdje se sve može dogoditi exception - sve bi trebalo biti jasno. Kod otvaranja veze, kod konfirmacije usernamea i passworda, kod izvršavanja SQL naredbe, zatvaranja veze....

U ovom postu ću objasniti što je sve potrebno (znači min. konfiguracija) da bi se koristio Hibernate. Prvo što se treba napraviti je otići na http://www.hibernate.org/downloads.html i skinuti verziju Hibernate koja nam treba. Ako se koristi Maven, onda je ovaj korak nepotreban jer nam ne trebaju jar-ovi nego samo dodamo zavisnosti u pom.xm. U ovom primjeru ću koristiti jarove a ne maven zavisnosti. Još treba naglasiti da ću koristiti verziju 3.6 Hibernate.

Kad je zip skinut i odzipan, naravite novi projekt u Eclipsu. Znači obični Java Project (ništa više) jer ćemo napraviti program koji rezultat prikazuje u konzoli. Nakon što je napravljen novi projekt, desni klik na folder projekta i pod Build Pathom dodamo jarove koji su nam potrebni. Jednostavno dodate sve jarove koji se nalaze u odpakiranom hibernate zip folder pod folderom lib/required. Što je i logično :) još dadajte i jar koji se nalaze u folderu lib/jpa. Još jedan jar se ne smije zaboraviti, a to je jar od JDBC drivera baze podataka koju ćemo koristiti u projektu. Ja ću koristiti MySql bazu pa mi zato treba i pripadajući driver koji se može naći ovdje:
http://www.mysql.com/products/connector/

Hibernateu stvarno ne predstavlja nikakav problem koji ćete bazu podataka koristiti. Možete koristiti MySQL, PostgreSQL, Derby DB... samo dodate u build path pripadajući jdbc driver i to je to, sve ostalo je isto za sve.

Pa da krenemo. Da bi program mogao raditi uz pomoć Hiberatea, potrebne su 3 stvari:
  1. Potrebno je kreirati bazu na serveru koju ćemo koristiti. Hibernate može stvarati tablice, ali ne može stvoriti bazu
  2. Potrebno je u projektu definirati hiberante.cfg.xml što je zapravo konfiguracijski xml gdje definiramo koji su korisnički podatci za bazu (korisničko ime i password), koje ćemo klase definirati kao tablice u bazi i još neke postavke
  3. i zadnje ali ni pod kojim slučajem ne najmanje važno postaviti Entity i Id  anotacije u klasi koju ćemo koristiti.
Naravno postoji još neke stvari koje trebamo napraviti u main klasi, ali o tome kad dođemo do toga.
Napravim novu klasu pod imenom Automobil. Ono što je velika koristi i prednost Hibernatea je da on koristi POJO klase.

@Entity
@Table(name="VOZILA")
public class Contact {
   
    @Id
    private int id;
     private String ime;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getIme() {
        return ime;
    }
    public void setIme(String ime) {
        this.ime = ime;
    }
}
  
Kao što je vidljivo ovo je obična POJO klasa sa geterima i seterima. Uz dodatak anotacija.
Ono na što treba točnije trebalo bi se raditi je paziti kod importa. Kaže se da je good practice (pogotovo kod ovih POJO klasa) importe raditi iz javax persistenca, a ne iz hiberantea. Importi iz hiberantea se rade za query, session factory i ostalo što je specifično za Hibernate, dok velika većina anotacija koje se stavljaju u POJO klase su postale dio standarda tj. javax persistenca. Naravno ništa vašem programu neće faliti ako napravite importe iz hibernatea, ali razlog zašto bi ih trebalo raditi iz javax persistenca jer su oni dio standarda i ako nam se pokaže potreba da npr. prebacimo se na neki drugi orm, moramo promijeniti samo importe u main klasi, dok POJO klase ostaje kakve jesu. A sada da objasnim anotacije i što su one zapravo.

Kada je hiberante kao ORM izašao na svjetlo dana nisu postojale anotacije nego se koristilo xml mapiranje. Znači za svaku klasu se radio zasebni xml u kojem su se pisali properties. Uglavnom isto kao anotacije samo uz puno više pisanja nepotrebnog koda. Anotacije su utoliko bolje jer su brže za napraviti, a da ne pričam da se nalaze u klasi koju nam treba. Ne trebamo otvarati xml file mapiranja i uspoređivati xml s klasom. Pomoću anotacija govorimo Hiberanteu šta mi točno želimo od klase i podataka koji se nalaze u njim.
Tako npr. jedna od glavnih anotacija je @Entity jer pomoću nje govorimo Hibernateu da ta klase je klasa koju on treba pretvoriti u tablicu i onda on može odraditi taj posao za nas. Sljedeća anotacija koja je potrebna da bi stvar radila je @Id anotacija. Ona jednostavno govori orm-u koje polje će biti primarni ključ u tablici, jer kao što svi znamo svaka tablica mora imati primarni ključ. I to je to što se anotacija tiče. Naravno postoji cijeli niz anotacija koje možemo uključiti i koje ćemo koristiti ako radimo išta ozbiljnije od običnog Hello world primjera, ali za sada toliko. U nekom sljedećem postu ću obraditi samo anotacije.

Nakon što smo odredili koje će klase orm koristiti potrebni je podesiti postavke, a one se rade u hiberante.cfg.xml file. Jednostavno ne pišete cijeli kod napamet ili iz početka odite u odzipani folder koji ste skinuli i pretražite za datoteke cfg.xml i iskoristite već postojani xml kao predložak. Dobro provjerite rezultate pretrage jer postoje cfg xml-ovi koji nisu potpuni.

A sada da objasnim par stvari:
Pod <!-- Database connection settings --> naravno unosite podatke koje se odnose na vezu, te tu unesite podatke koje odgovaraju vašim potrebama. Malo zbunjujući pojam je tag dialact. To nije ništa drugo nego sintaksa koju ćete koristiti u pisanju vašeg koda koji se bavi upitima. Postoji čitav niz dijalekata, ali ako koristite MySQL odaberite MySQL dialekt. Ta opcija postoji ako želite koristiti dialekt koji se koristi isključivo u određenoj bazi podataka a npr. nije definiran u standardnoj SQL sintaksi  i na to je jedini način na koji možete koristiti taj dialek.
<property name="hbm2ddl.auto">create</property> je vrlo važan tag! I jedna vrlo moćna funkcija ORM-a. Ovo zapravo govori Hiberanteu da kada pokrenete program ako on ne nađe tablicu da je stvori, a ako postoji već on je dropa i ponovo stvori sa novim podatcima. A ako stavimo vrijednost umjesto create na update, onda pri pokretanju (ako postoji već tablica sa istim imenom) on je neće dropati pa ponovo kreirati nego će samo zapisati novonastale promjene. Tako da se kaže da u development fazi se ovo postavi na create a kad se isporučuje program onda se ova vrijednost postavi na update.
Još nam je jedno svojstvo ostalo za podesiti, a to je sljedeće:
<mapping class="com.punoimepaketa.ImeKlase"/> Ovdje jednostavno stavimo puno ime paketa i klase koju želimo da Hiberante pretvori u tablicu, tj. sve one klase u kojima smo stavili @Entity anotaciju. Naime nije dovoljno staviti anotaciju, jer ako ovaj korak ne odradimo neće se dogoditi ništa.


Još nam samo preostaje da napravimo našu main klasu i to je to. Pošto je ovaj post namijenjen više kao teorijski a ne kao praktični primjer, tj. post koji će vam skrenuti pažnju na neke stvari koju su potrebne, neću sada ovdje pisati main klasu. Ujednimo imam osjećaj da pišem preduge postove i da će se teško naći osoba koja će ih cijele pročitati. Još jedna činjenica je da nitko neće doći na moj blog naučiti Hibernate, naime ovo sve može poslužiti kao dobar podsjetnik ili kao dobra smjernica.
Zato ću u jednom u sljedećih postova napraviti praktični primjer gdje ću u detalje objasniti main klasu i gdje ću dati cijeli kod. Do tada pozdrav

utorak, 10. siječnja 2012.

Virtual pairs programmers iliti kako sam uložio 129$ u svoje znanje

Virtual pairs programmers je jedna odluka koju sam vagao i razmišljao dali da ili ne, ali koju nisam požalio. Štoviše svakome bi preporučio da isto napravi.

www.virtualpairprogrammers.com


Obično su Amerikanci ti koji radi video materijale za  e-learning, tako da sam bio ugodno iznenađen što su autori ovih materijala Englezi. Ako išta mogu reći, oni su pokazali kako se to radi premda sam bio skeptičan.

Prvo što ću objasniti je razlog zašto sam odlučio uložiti 129$ u svoje znanje. Smatram da je znanje jedina stvar koju ti nikad nitko ne može oduzeti i ne može osporiti, tako da svaki dolar, euro, kuna uložena se može samo vratiti. Osnovni razlog zašto sam se odlučio za Spring MVC je jer želim se baviti web developmentom a nakon Hibernatea, Spring MVC je logičan izbor, posebno radi dobre integracije njih skupa.
Naravno tražio sam po netu tutoriale, ali osim osnovih Hello Worlda ništa pametnije nisam našao. Ponuda knjiga na tu temu je i više nego očajna. Postoji knjiga od Apressa od Spring MVC-u i WebFlowu ali koja se bazira na verziji 2.0. Ako ste i malo upućeni u Spring znat ćete da je to verzija prije anotacija. Znači svaka klasa je nasljeđivala nešto i hrpu nekih metoda i ... uglavnom anotacije - BOG VAS BLAGOSLOVIO!!!
Za verziju 3.0 ne postoji jedna knjiga neko se može naći po poglavlje u knjiga Spring in Action i Spring Recepies.
Premda Spring slovi kao framework s najboljom dokumentacijom ikad, čak i od verzije 1.0. nije ni tu sve bajno. Postoji stvarno opsežna dokumentacija, čak i Spring MVC izrada aplikacije step-by-step ali za verziju 2.5. Nešto im i nije na listi prioriteta da isto naprave za 3.0. ili sad već za 3.1. Očito je da guraju svoj najnoviji projekt koji će kad tad možda i u potpunosti izgurnutu Spring MVC iz samostalne upotrebe, a to je Spring Roo.

Odlutao sam previše od orginale teme, pa da se vratim. Odluka je pala, kupujem! Brza transakcija preko pay pala i na mail dolazi link. Skidam 15 lekcija o Spring MVC-u i Web Flowu.
Svaka lekcija je super objašnjenja! Bez pretjerivanja. Čak se autor i potrudio pošto se sve bazira na verziji 3.0 da objasni kako bi stvari i izgledale u 2.5 na mjestima gdje se razlikuju tako da ako se ikad nađete bačeni u kod od 2.5 da znate o čemu se radi.
Još jedan plus je njihova služba podrške. Na moj upit oko jednog poglavlja (prije bilo kakve moje kupnje uopće) odgovor mi je došao u rekordnom brzom roku, premda je bila subota popodne. A da ne pričam kada sam naletio na pogrešku u poglavlju sa Spring MVC-om i JSON-om.
Naime autor sve primjere kada su gotovi prikazuje u google chrome, a ja u firefoxu. I na moje iznenađenje (radio se primjer o autocomplete u search boxu) prateći i prepisujući isti kod koji autor piše, njegov primjer radi, a moja doSearch funkija ne radi, štoviše dobivam error da funkcija u js nije definirana???
Posalao sam im mail, i u rekordnom roku mi je autor poslao mail da mu pošaljem cijeli war file jer prema ovome što on vidi iz mojeg jsp filea je da bi sve trebalo raditi ali ne radi. Nekoliko sati kasnije mi autor odgovara da mu je ovo bio pravi brain teaser :) ali da je uspio to na kraju riješiti. Naime on je kod snimanja materijala koristio verziju Chromea koja podržava ne zatvaranja tagova u html-u. tj ako ga vi zaboravite zatvoriti on će to sam napraviti za vas, a moj firefox, a i verzija Chromea (premda novija) koju sam ja koristio to ne podržavaju - vjerovatnost kao i dobitak na lotu!
Uglavnom mi smo u početnom script tagu isti tag i zatvorili, a da bi jquery include radio mora se imati otvarajući script tag, prazno mjesto pa zatvarajući tag. Čak mi je poslao i link na stackoverflow zašto je važno da se taj script tag tako zatvori, te da sam ja bio prvi koji je uočio taj problem i da je sve to stavljeno u erraratu. Svi sretni i zadovoljni, ja bogatiji za znanje, a oni siromašniji za error.

Sve u svemu njih moram preporučiti svakome, ako se dvoumite svakako kupite jer nećete požailiti

Indijac koji znanje znači!

Na prvi pogled naslova neki bi se mogli zbuniti, ali dobro vas oči služe. U ovom postu ću pažnju posvetiti jednom indijcu koji mi je puno pomogao. Naime on je svoje znanje odlučio podijeliti s ostalima na YouTubu, za besplatno.

Njegovo je ime Koushik i možete ga naći na:
http://javabrains.koushik.org/

On je napravio čitave serijale o popularnim Java EE tehnologija. Moja preporuka je da se krene sljedećim redom, a ako pogledate datume dodavanja pojedinih videa mislim da je i autor to tako naumio:

  1. Za početak Maven, uz jednu primjedbu da njegove materijale trebate malo proširiti. Pročitajte knjigu Apache Maven 3 Cookbook i na konju ste.
  2. Sljedeće što bi trebali naučiti su JSP i Servleti, nema ih puno ali ako ne znate osnovne pojmove, momak to jako dobro objašnjava.
  3. I dolazimo do onoga za što amerikanci u žargonu kažu - what seperates men form the boys, tj. Hibernate ORM. 34 tutorijala koji će vas postaviti na pravi put. Nakon toga čitanje knjiga i nadograđivanje znanja je vrlo lako.
  4. Naravno nakon toga slijedi Spring. Vrlo dobro objašnjeni, samo nepotpuni. Mislim vrlo lako se to moglo nadograditi sa još hrpom tutorijala, ali tko zna možda i bude jednog dana. Naravno moja najveća zamjerka je što nije napravio web dio Springa (meni i najvažniji), a da ne govorim da je mogao napraviti i neki realni primjer. Neka me netko krivo ne shvati, momak je napravio sjajnu stvar ali da je odlučio napraviti nekakvu web aplikaciju gdje primjenjuje znanje naučeno u tutorijalima, to bi bio pravi pogodak.
Zadnje što je počeo je Struts 2 tutorijala, koje ja ne mislim učiti. Nikad ne reci nikad, ali kako stvari stoje za sada ne mislim. Naravno pogledati ću ih da vidim kako framework radi, ali ipak je moj izbor Spring MVC.

Prvi problem na koji se nailazi s velikom većinom samo-prozvanih tkz. Java "gurua" je jezik, točnije engleski. Ne želim generalizirati, ali njima engleski jezik baš i ne ide. Znam da nisu svi nadareni za jezike, ali naći ovu kombinaciju kao što je Koushin na YouTubu je pravi dragulj. Ali ima jednu manu čak i on. Ne znam zašto mu to nitko nikad nije rekao ali u engleskom se h u sredini riječi ne čita :) Tako kada slušate 20-ak tutorijala i on stalno izgovara ime klase pod nazivom Vehicle sa h, malko zbunjuje. Možda ga je engleskom poučavao netko iz Texasa koji na sličniji način izgovaraju vehicle, tko će ga znati.
Velika većinu njih nikada se neće razumiti, premda imaju potrebno znanje, plus mora se uzeti u obzir da nisu svi u mogućnosti tj. pri znanju da prenesu svoje znanje na drugoga. Neki jednostavno pričaju previše, neki premalo, neki pre nerazumljivo... i lista se tako nastavlja.

Osobno sam više tip osobe koji više voli nešto vidjeti kako se radi nego čitati stranice i stranice knjiga te pokušavati razumjeti šta je pisac mislio. Naravno, zavisi o čemu se radi. Kada svladam nešto, knjige su neophodni alat, koji s lakoćom čitam jer imam znanje koje je potrebno samo usmjeriti u pravo smislu.
Zato živim u nekom utopijskom snu da jednoga dana će sav materijal koji mi je potreban biti u video obliku.