reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

Java + Struts + Spring + Hibernate + MySQL

Intri (3490)|2.4.2009 23:18
Zdravím.

Používám tenhle řetězec prostředků, musím v něm udělat projekt do školy. Thread jsem pojmenoval obecně, protože není vyloučeno, že tady budu psát trochu více.:-)

Momentálně mám následující problém ( dlouhý příběh krátce ): Javou posílám skrz Hibernate na MySQL databázi jednu třídu plnou stringových atributů. Entitní typ v databázi má samozřejmě své atributy taky stringové ( varchar ). Potíž je, že při pokusu přidat novou entitu mi Hibernate vyplivne PersistenceException.

Základní otázka by tedy byla asi trochu nubská, ale nepovedlo se mi to vygooglit: za jakých okolností PE vzniká? Jaká událost v DB/Hibernate ji vyvolá?
xmarek (1676)|3.4.2009 14:06
Možná jsem přesně Vás dotaz nepochopil. A tak bych Vás poprosil o trochu podrobnější popis toho co řešíte. Nezajímá mě analýza problému, ale spíš řešení ve Spring vs. Hibernate (Struts bych pro začatek vynechal i když by nebylo špatné zmínit verzi 1 nebo 2). Tj. použiváte klasické mapování prostřednictvím XML nebo anotace? Od toho se odvozuje konfigurace aplikačního modulu Springu. Dále přístup k databázi je prostřednictvím DAO které jsou zděděné od HibernateDaoSupport?

Možná bych uvítal nějaký link na zdrojový kód.

Doufám, že Vám budu nápomocen přece jen mám nějaké ty mezery v teorii :D, ale něco jsem už na těchto technologiích dělal.
Intri (3490)|3.4.2009 16:12
Už je to v pohodě, včera v noci se mi to podařilo vyřešit.:-) Ale díky moc za ochotu, je dost možné, že se tu ukážu zas s dalším problémem.
xmarek (1676)|3.4.2009 18:07
Tak hodně štěstí.

Jinak vřele doporučuji použít pooling, transakce a na zabezpečení Acegi.
Jen tak naokraj: poměrně známý problém při použití Struts-i je zobrazovaní češtiny, který lze lehce vyřešit pomocí filtru ve Web deployment descriptoru.

Osobně mám technologie jako Spring a Hibernate velmi rád. :D Ostatně jako celou Javu. :D
Intri (3490)|3.4.2009 23:33
No, mám další dotaz, snad se stihne zodpovědět celkem rychle, moc času už nemám ( celou sobotu až do neděle budu pryč ):

Mám formulář. Z něj posílám do akce ve struts 2 nějaké hodnoty. Akční třída si je přebere a při skončení akce je předá nové JSP stránce. To je všechno v pořádku. Jen by mě zajímalo, proč akční třída nepředává JSP stránce proměnné, které si definuju v průběhu akce. Situace:

[CODE]private String login;
private String password;
private String typ;
private Uzivatel uzivatel;

public String execute() throws Exception
{
.
.
.
typ = uzivatel.getTyp();
.
.
.
}
[/CODE]

Metoda execute se zavolá v pořádku, akce skončí úspěchem, všechno v pořádku. Až na to, že na stránce tag prostě nic neudělá, zatímco vypíše v pohodě. Když za value dám uzivatel.typ nebo uzivatel.getTyp(), dopadne to stejně blbě.

Dost mi přijde zajímavé, že i když typ zahrnu do formuláře, který akci spouští, stejně se proměnná typ nevypíše, zatímco login a password v pohodě...
xmarek (1676)|4.4.2009 11:22
Nemám zkušenost se Struts 2, ale myslím si, že tyto věci se asi lišit nebudou. A doufám, že nebudu plácat nesmysly. :D
Takže např. když chci naplnit např. nějaké komponenty daty na volané JSP stránce tak to dělám takto:

public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// toto je pouze test jestli mam vybrany zaznam v tabulce
if (httpServletRequest.getSession().getAttribute("projectId") == null) {
ActionMessages errors = new ActionMessages();
errors.add("project", new ActionMessage("errors.select"));
saveErrors(httpServletRequest, errors);
return actionMapping.findForward("/projectList");
}
// form, ktery je pridruzeny k volane JSP strance
RepairProjectForm repairProjectForm = (RepairProjectForm) actionForm;
// naceni dat z databaze
Project project = projectDao.getProjectById(Integer.valueOf(httpServletRequest.getSession().getAttribute("projectId").toString()));
// pridani informace, kterou vyuzivam v dalsim volani
httpServletRequest.getSession().setAttribute("firm", ContentSelect.getFirms(companyDao));
// naplneni dat, k tomu ucelu pouzivam vlasni mapper, nejde o nic jineho jak o nastavovani promennych ve formulari
ProjectMapper.loadData(repairProjectForm, project);
// a pak zobrazim stranku
return actionMapping.findForward("/repairProject");
}


Jinak pro jakékoliv přeposílání dat používám standardně:

httpServletRequest.getSession().setAttribute("klic", object);

a nebo v případě, že chci pouze přeposlat stránce hodnotu a nechci ji uchovat v session pro další stranky:
httpServletRequest.setAttribute("klic", object);
Intri (3490)|5.4.2009 19:58
Díky moc, už mi to jakžtakž funguje.

Jen by mě ještě zajímala jedna "drobnost" - je při práci s Glassfishem normální, že uděláš chybu třeba v SQL dotazu ( v mém konkrétním případě jsem se prostě upsal v názvu sloupce ) a Glassfish se pak chová stále stejně a hlásí pořád stejnou chybu, i když jsi chybu už dávno opravil?

Nepomohl re-deploy, restart Glassfishe a dokonce ani restart celého PC - pořád hlásí "unknown column autor in where clause", přestože jsem autor už dávno přepsal na login ( čili správné jméno sloupce, který jsem chtěl ).

EDIT: Tak i toto je už vyřešeno... Špatně jsem napsal SQL dotaz, hodnotu za login= jsem nedal do uvozovek. Dobře mi tak. Asi by se mi už opravdu hodila pauza.
xmarek (1676)|6.4.2009 15:22
Tak gratuluji. :D
Jinak taková drobnost. Ne všechny chyby Glassfish (a nejenom on) zobrazí jak by si člověk přál, jednak záleží na urovni logování (log4j konfigurace) a některé chyby jsou tak obecné, typu někde se stalo něco. Např. jsem se při JPA (obdoba Hibernate) upsal nebo spíše jsem nenapsal, že persist. objekt iplementuje Serializaci a několikahodinový problém byl na světě. :D

Každopádně doporučuji při injektáži springu používat: InitializingBean

@Override
public void afterPropertiesSet() throws Exception {
if (userDao == null) throw new IllegalStateException("userDao must be set!");
...
}

samozřejmě mimo třídu, která extenduje HibernateDaoSupport, tam už podobná věc je. :D Člověk se tím vyhne opomenutí v applikačním modulu.