Publikované pred 11 mesiacmi: 04.06.2012 / Andrej Chu, čítaní: 26
Správca entít1. LocalEntityManagerFactoryBean - jednoduchšia verzia továrne pre inštancie správcov entít, životný cyklus je kontrolovaný aplikáciou. Je vhodná v jednoduchých implementáciách, väčšinou fungujúcich ako standalone aplikácie.
LocalContainerEntityManagerFactoryBean - táto továreň je vhodnejšia na komplexnejšie aplikácie, pretože poskytuje plnú podporu vlastností JPA. Životný cyklus je kontrolovaný kontajnerom a parametre poskytujú flexibilné možnosti inicializácie databázového spojenia vrátane možnosti získania spojenia zo zdroja JNDI.
Obe verzie správcov majú spoločného predka, a tak ich použitie je pre Spring transparentné.
V prípade použitia prvej, jednoduchšej verzie správcu entít treba pridať do nášho konfiguračného súboru context.xml nasledujúci bean:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa. LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="persistenceUnit"/> </bean>
Pri takto vytváraných inštanciách správcov entít je potrebné, aby bol k dispozícii súbor persistence.xml (obyčajne umiestnený v adresári META-INF). Tento súbor obsahuje perzistenčnú jednotku (persistence unit), ktorá obsahuje informácie o entitách. Formát súboru môže vyzerať takto:
<?xml version="1.0" encoding="UTF-8" ?> <persistence 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" version="1.0"> <persistence-unit name="persistenceUnit"> <class>Movie</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc://localhost/dbname"/> <property name="javax.persistence.jdbc.user" value="admin"/> <property name="javax.persistence.jdbc.password" value="admin"/> </properties> </persistence-unit> </persistence>
Ako vidíme, perzistenčná jednotka nesie aj informáciu o pripojení k databáze (nakonfigurovanej pomocou JDBC URL). Takisto obsahuje zoznam tried anotovaných ako entity. V našom prípade teda ide o jedinú triedu Movie. V prípade vytvorenia novej entity stačí pridať nový riadok do tohto súboru.
Rovnako je dôležité definovať názov perzistenčnej jednotky, pretože prostredníctvom neho je tá potom identifikovaná pri inicializácii továrne pre správcov entít v súbore context.xml.
Druhá možnosť je použitie továrne spravovanej kontajnerom. V takom prípade by sme pridali do nášho súboru context.xml nasledujúci záznam:
<bean id="datasource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="JNDI_meno_poolu"/> </bean> <bean id="entityManagerFactory" class= "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
Prvý vytvorený bean slúži na získanie databázového spojenia zo služby JNDI. Ide o pomerne štandardný spôsob správy databázového spojenia, vďaka ktorému môžeme údaje o pripojení (ako používateľské meno a heslo) oddeliť od konfigurácie aplikácie. Následne sa tento databázový zdroj použije na vytvorenie továrne pre správcov entít.
Takisto možno získať túto továreň priamo zo zdroja JNDI v prípade, že tento objekt bol nakonfigurovaný administrátorom a po vytvorení kontajnerom daný k dispozícii prostredníctvom služby JNDI. V takom prípade by stačilo nadefinovať v konfiguračnom súbore bean získaný z tejto služby:
<beans> <jee:jndi-lookup id="myEmf" jndi-name="JNDI_meno"/> </beans>
Teraz už teda vieme, ako správne vytvoriť továreň pre správcov entít, či už manažovanú aplikáciou, alebo kontajnerom.
Ak si spomeniete na predošlý diel, uviedli sme tam, že objekty DAO používajú atribút správcu entít s anotáciou PersistenceContext. Na to, aby boli tieto atribúty správne inicializované injektovanými inštanciami, je však nevyhnutný ešte jeden krok, a to pridanie nasledujúceho beanu do nášho konfiguračného súboru context.xml:
<bean class= "org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
Tento bean predstavuje postprocesor, teda triedu, ktorá sa stará o post-spracovanie inštancií manažovaných Springom, ktorý nám zabezpečí už spomínanú potrebnú inicializáciu referencií na inštancie správcov entít.
Teraz máme Spring síce nakonfigurovaný na prácu s entitami, ale zatiaľ ešte stále neexistuje žiadna inštancia disponujúca naším rozhraním DAO, ktorú by sme mohli použiť na spracovanie našich entít. Preto musíme pridať do súboru aplikačného kontextu context.xml ešte jeden bean:
<bean id="movieDAO" class="MovieDAOImpl" />
Teraz už máme k dispozícii kompletnú podporu pre perzistenčné operácie s entitami Movie a môžeme si vytvoriť napríklad triedu controller pre túto entitu:
class MovieController {
@Resource(name="movieDAO")
private MovieDAO movieDAO;
public void addNewMovie(String name, String type) {
Movie movie = new Movie();
movie.setName(name);
movie.setType(type);
movieDAO.save(movie);
}
}V príklade vidíme, že atribút movieDAO je injektovaný beanom z kontextového konfiguračného súboru, takže nie je inicializovaný priamo v kóde. Vďaka tomu môžeme používať rozhranie MovieDAO bez nutnosti odkazovania na konkrétnu implementáciu.
Obdobne by sme pridali metódy na aktualizáciu alebo zmazanie entity z databázy.
Na uvedenom príklade stojí za povšimnutie i to, že inštancii Movie nenastavujeme atribút id. Preto očakávame, že jeho hodnota bude automaticky vygenerovaná databázou, napr. z nejakej sekvencie. Pre takéto správanie však musíme ešte učiniť jednu malú zmenu v triede Movie, a to pridanie anotácie GeneratedValue:
@Entity
@Table(name="movie")
class Movie implements Serializable {
@Id
@Column(name="id", nullable=false)
@GeneratedValue(strategy=GenerationType.AUTO, generator="gen_name")
private int id;
// zvyšok kódu triedy ...
}Zdroj: IW 6-7/2012