Až Vám zčerná obrazovka, přejděte na Linux!

Proč používat Linux

středa 9. dubna 2008

Hibernate a tabulky bez primárních klíčů

Jsou lidi, kteří tvrdí, že mít tabulku bez primárního klíče je nesmysl. A proto se bez něj Hibernate neumí pohnout. Já s nimi nesouhlasím.
Mějmež jednoduchý příklad: chceme uložit přichodivší fakturu do databáze. Faktura obsahuje hlavičku (kdo, kdy,...) a několik položek. Každá položka faktury má pevně danou strukturu. Z hlediska databázisty jednoduchý případ jak facka. Jedna tabulka pro fakturu (ID faktury, hlavička a stav), druhá pro položky (id faktury jako cizí klíč a atributy položky (cena, množství,...).
No jo, ale zkuste toto udělat v Hibernate! Jediná cesta, kterou jsem vygoogloval, je vytvořit fake_id pro každou položku každé faktury! FUJ! řeknou kování DBáci. A já s nimi.
Možná, že znáte jinou cestu. Rád se ji dozvím.

Hibernate a Primary Foreign Key

Tak jsem si dneska pořádně naběhl. Chtěl jsem si dvě tabulky provázat přes sdílený klíč, který byl v první Primary Key (tam záznam jako první vzniká) a po zpracování dat uložit do jiné tabulky řádek, jehož ID odpovídá tomu prvnímu, tedy bude hrít roli Primary a Foreign Key zároveň. Principiálně nic složitého.
Nechal jsem si v Idei vygenerovat příslušné anotace:

public class DataBindingEntity {
private long recordId;

@Id
@Column(name = "RECORD_ID", nullable = false)
public long getRecordId() {
return recordId;
}

public void setRecordId(long recordId) {
this.recordId = recordId;
}


private HibertestEntity hibertestByRecordId;

@OneToOne
@JoinColumn(name = "RECORD_ID", referencedColumnName = "ID", nullable = false)
public HibertestEntity getHibertestByRecordId() {
return hibertestByRecordId;
}

public void setHibertestByRecordId(HibertestEntity hibertestByRecordId) {
this.hibertestByRecordId = hibertestByRecordId;
}
...
}

public class HibertestEntity {
private long id;

@Id
@GeneratedValue(generator="triggerAssigned")
@GenericGenerator(name = "triggerAssigned",
strategy = "jpl.hibernate.util.TriggerAssignedIdentityGenerator")
@Column(name = "ID", nullable = false, length = 22)
public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}
private DataBindingEntity dataBindingById;

@OneToOne(mappedBy = "hibertestByRecordId")
public DataBindingEntity getDataBindingById() {
return dataBindingById;
}

public void setDataBindingById(DataBindingEntity dataBindingById) {
this.dataBindingById = dataBindingById;
}
...
}


Jenže jsem si parádně naběhl. Během inicializace sezení jsem chytil NPE:

13:04:59,125 ERROR [[acceptor]] Allocate exception for servlet acceptor
java.lang.NullPointerException
at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)


Zakomentování OneToOne propert na obou stranách problém vyřešilo. No, vyřešilo ... :-(

takže si to musím řešit ručně. Nedá se nic dělat.

pondělí 7. dubna 2008

IDEA 7, Hibernate a DB generovaná ID

Musím uznat, že ač je práce s Javím perzistorem Hibernate v IntelliJ IDEA celkem přímočará, dostanete se do stejných potíží, jaké u Hibernate mají i ostatní uživatelé. IDEA je přeci jenom vývojový nástroj, ikdyž geniální. Nic míň, ale také nic víc.
Potřeboval jsem qůli klastrovatelnosti nechat databázi generovat IDčka záznamů. V Oracle je to jednoduché, jde to naklikat v Oracle XE konzoli. ve výsledku asi nejkratší možný SQL záznam vypadá:

CREATE TABLE "HIBERTEST"
( "ID" NUMBER,
"DATA" BLOB,
CONSTRAINT "HIBERTEST_PK" PRIMARY KEY ("ID") ENABLE
)

CREATE OR REPLACE TRIGGER "BI_HIBERTEST"
before insert on "HIBERTEST"
for each row
begin
select "HIBERTEST_SEQ".nextval into :NEW.ID from dual;
end;


Pro pouhé uložení záznamu vám stačí nastavit IDčku hodnotu -1 (pro zachování nullable=false) a Oracle to přeplácne za Vás. Potíž nastane v okamžiku, kdy chcete s onou zaperzistentněnou beanou dál pracovat a mít v ní ono ID. Naštěstí bratr Google opět pomohl.
Jean-Pol Landrain napsal velice triviální a nádherný PostInsertGenerator, který to řeší velice elegantně. Podívejte se sami.
Pak stačí entitě v IDEA přidat anotaci

@GeneratedValue(generator="triggerAssigned")
@GenericGenerator(name="triggerAssigned",
strategy = "jpl.hibernate.util.TriggerAssignedIdentityGenerator")

a je vymalováno.

IDEA 7 aneb Tak dlouho jsem se bránil hibernate, až se ucho utrhlo

Nastoupil jsem do nového zaměstnání - do hradišťské firmy BARCO a začal psát J2EE aplikaci postavenou nad SQL. O hibernate jsem nechtěl ani slysšet, protože když jsem naposledy viděl jeho konfiguraci, jímala mne hrůza a běs.
Ale nainstaloval jsem si novou IntelliJ IDEA, IMHO nejlepší nástroj na vývoj aplikací v Javě, která podporu Hibernate v sobě obsahuje. Tak jsem to zkusil. V Oracle XE konzoli jsem si nadefinoval tabulku, dal do ní cvičně jeden řádek a zkoušel jsem, co s tím IDEA dokáže za kouzla. A byl jsem mile přeqapen.
Postup je velice jednoduchý. Ze všeho nejdřív si v projektu nadefinujte DataSource ukazující na onu tabulku (Menu->Tools->Data Sources..., nezapomeňte na Refresh Tables jako já :-) ). Pak vytvoříte v projektu nový modul typu Hibernate, zasociujete jej s Data Sources, přidáte Deskriptor (IDEA sama nabídne jediný možný ;-) ) a potvrdíte. Pro modul víc nepotřebujete.
Poté se už jenom v projektovém navigátoru přepnete do pohledu Java EE: Structure, kliknete na nový Hibernate projekt a v kontextovém menu vyberete Generate Persistence Mapping->By Database Schema a pak jen zíráte.

pátek 21. března 2008

Tak jdeme na Linux

Tento týden jsem byl na pracovním pohovoru na pozici Systémáka u jednoho ISP. Jakožto dlouholetý Linuxák jsem si celkem věřil. Jenomže ve znalostním testu jsem ze 17 bodů dostal jenom 29/3! Holt ta hnusná skleněná nemoc je fakt hnusná. Tak jsem se rozhodl, že se zase vrátím ke starému dobrému řemeslu - postavím si na nějaké staré šunce pěkný Linuxový server. A abych to všechno hned zase nezapomněl, své pokusy tu budu zaznamenávat pro budoucí generace. Takže se snad máte na co těšit.

Stav studentů na tocích valašských

Moje Jaruška zkusila učit na Střední Gastronomické Škole ve Zlíně. Matiku, fyziku, výpočetku. Fyzika ji sice nikdy nebavila, natož aby ji učila, ale zkusila to zkousnout. No, řekněme si to na rovinu, po třech měsících to vzdala. Přeci jenom neměla zájem dělat policajta děckám, kterým i kantoři říkali naši idioti. Neměla jediný den, kdy by někdo nepřišel do školy sjetý či aby řešila útěky studentů si ven zahulit. Nejhorší ale bylo, že neměla žádné zastání u vedení. Raději aby si to vyžrali učitelé než děcka, protože učitelé školu žalovat nesmějí...

Říkali jsme si, že to je tím, že tam to byl učňák a že tam berou jenom to nejhorší atd. A že na prestižní škole, jakou Zlínské Gymnázium bezesporu bývalo, to tak bude. No, posuďte sami.

Jak už jsem včera psal, byl jsem se ve Zlíně na gymplu znovu podívat. A to, co jsem zažil, když jsem si šel povykládat se svou oblíbenou profesorkou Informatiky a Programování, bylo úděsné.

Nejdřív šla zadat práci děckám do třídy její kolegyně. Byli na ni tak sprostí, že jsem se jim tam šel taky ukázat. Naznačil jsem jim, že ve školství jsou sice tělesné tresty zakázány, ale já že učitel nejsem. A že vahou svých 110kg si dokážu svou prosadit. Obzvlášť, když někdo bude tak hloupý a bude nevychovaný k mé oblíbené paní profesorce. To je naštěstí usadilo a celou hodinu pak byl klid.

Potom jsme rozebírali, jací že teď jsou studenti. Stežovala si, že dneska je vůbec nic nezajímá. Všechno chtějí hned a zadarmo. Do programování se neučí. Když nejhorší žačka z naší třídy dostala dvojku, profesorka Pospíšilová se jí přímo omlouvala, že jinak to nešlo... . A dneska? Minulý rok vyhodila jednoho kluka od maturity! Z programování! To mě fakt vyrazila dech.

Ale to, co přišlo potom, to prostě nemělo obdoby. Přišla do kabinetu jedna studentka. A teď musím citovat celý rozhovor:
"Paní UČITELKO, můžete pro mě udělat laskavost?"
"Mlaskavost?" :-)
"Mohla byste mi toto přepálit?"
"Víš, mám teď volno a potřebuju teď udělat nějakou práci."
"Víte, ona mi to půjčila kamarádka..."
"A co to vlastně máš?"
"Ale nic, jenom DVDčko s FILMAMA..."
"Tak o tom nechci nic vědět."
"Ale je to jenom jedno DVDčko, to vám přece nic neudělá..."
To už jsem nevydržel: "Odejdi, dokud ti to říkám slušně!"
Nasupeně odkráčela. Věřte mi, já jsem dobrák od kosti, ale tolik nevychovanosti a neúcty vůči profesorce, která si svou lidskostí dokázala získat celou naší třídu, jsem prostě nečekal a nikdy nezažil. Paní profesorka to zakončila slovy: "Pro vás byla lidskost u profesorů velké plus. Pro dnešní děcka je to slabost."

Ach, jak hluboko jsme klesli.

Ach jo aneb Viděti umírat svoji Alma Mater umřít

Po 16 letech jsem se byl podívat na místo činu, na Gymnázium Zlín. To, co jsem uviděl, mne ohromilo. Když jsem maturoval, bylo na gymplu 8 samostatných pavilónů (šest přízemních, tělocvična a třípatrový pavilon přírodních věd), mezi kterými se muselo přecházet venkem (jojo, o přestávce jsme se nachodili, dalo se i koulovat).

Od té doby došlo k mnoha změnám. Přízemní pavilony vyhnaly do výšky, všechny pavilony jsou propojeny krčky (tunelózní chodby), jeden pavilon (likusák) pod tíhou předloňského sněhu spadl. Architektonicky úžasně zpracováno.

Procházel jsem se chodbami. Nejdřív v nových částech přístavby. Všude to čpělo novotou. Krásnou, ale takovou neosobní. Až ve starých, přízemních pavilonech, které nedoznaly tolik změn, na mne dýchla stará známá atmosféra. Z oken byly vidět stromy, na kterých jsme dělali depressionistické skulptury, sem tam dokonce i pozůstatky starých venkovních schodů, jenom už to nebylo tak príma omšelé.

Pak jsem prošel posledním, nejdelším krčkem. A byl jsem zase doma. V osmičce (pavilonu přírodních věd, nyní sedmý pavilon) jsem za sebou nechal celou tu novotu. Byla tu cítit stejná vůně jako před 16 lety. V patře chemie byla cítit vůně chlóru, fyzikální patro čpělo onou neopakovatelnou směsicí vůní strachu, starých koberců, dřevotřísky a kdovíčeho ještě. Patro biologie bylo pořád stejně ničímnečpící jako dřív. Staré nátěry na zdech, staré ošoupané zábradlí na schodech mezi patry.
V suterénu byly stejné nálepky SWS na stejných dveřích. Stejný koberec u vchodových, teď zamčených dveří. Hned po přestávce jsem dokonce viděl jednu fyzikářku, jak vchází do dveří učebny a volá: "Po třech!". Ach, pane profesore Neužile, s jakou nostalgií na vás vzpomínám! Pro ty, kdož neví, o co se jedná, tak v oněch učebnách jsou dvě řady dvojlavic, takže sedí vždy čtyři a čtyři. Po třech znamená, že jeden je vykázán přesednou si někam jinam (zadní lavice bývají volné a při nejhorším se berou židle a jde se sednout ke stupínku, k oknu, prostě kde je místo. Jednou si pamatuju, že David Zuzaník seděl u umyvadla a psal na obrazu s fotkou pana prezidenta :-) ).
Jenom náš kutloch, naše KLAMácká místnost (KLub Aplikované Mikroelektroniky), se stala místností pro uklízečky. Byl jsem celý nažhavený, když jsem žádal pána z dílny, který tam byl ještě za nás, aby byl tak hodný a tu místnost mi otevřel. Veškerý nábytek byl pryč, ale stále tam byly patrné stopy po naší činnosti. Před 17 lety jsme tam sádrou opravovali omlácené rohy a ta sádra na těch rozích byla pořád!

Pak jsem vstoupil do kabinetu fyziky a byl tam pořád stejný profesor Šamánek, pořád ve stejné košili. Hned poté přišel můj profesor biologie Gill. Pořád stejný, byť pořádně prošedivělý. Páni profesoři mi ukázali laboratoř fyziky. Nádherná. Krásné lavice po dvou, v každé počítač s LCDčkem. Prý pořízená z peněz nadace Gymnázia Zlín. Ale pak přišlo rozčarování. Obrovské. Byly zrušeny matematicko-fyzikální třídy (kterou jsem já absolvoval). Ony krásné laboratoře (nové jsou i chemické i biologické) nejsou téměř využívány! Přírodní vědy, ona perla gymnázia Zlín, kterou mu mohli všude závidět, je totiž na ústupu na úkor humanitních předmětů! Nemám nic proti dějepisu či společenským naukám, ale dokážete si představit, že by šli absolventi gymnázia na medinu, aniž by zavadili o Mikroskop? Dokážete si představit, že něco takového dovolí ředitel, který tento gympl prošel sám, jehož maminka tam také učila, ale hlavně který sám je matematik-fyzik? A co se týká výpočetní techniky, tak dotace celkem 4 hodiny za osm let studia, to v době totální computerizace je holý nesmysl.