A mondás az, hogy azért került be csaj az EJB3 JSR alá, hogy gyorsabban át lehessen nyomni a processen. Ezzel szembe akár standalone alkalmazásokba is lehet használni.
A lényege, hogy Pojo entitásokat használ, és egy absztrakt apit definiál, amivel perzisztálni lehet ezeket. Descriptor helyett pedig annotationok vannak a Pojoban.
Szép, egyszerű: ide is rakok egy példát az íze kedvéért:
Az entitás
package jpasample; import java.io.Serializable; @javax.persistence.Entity public class SampleEntity implements Serializable { @javax.persistence.Id private Long id; public SampleEntity() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public int hashCode() { int hash = 0; hash += (this.id != null ? this.id.hashCode() : 0); return hash; } public boolean equals(Object object) { if (!(object instanceof SampleEntity)) { return false; } SampleEntity other = (SampleEntity)object; if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false; return true; } public String toString() { return "jpasample.SampleEntity[id=" + id + "]"; } }
A meghívó program már egy kicsit bonyolultabb, de csak a tranzakció és kivétel kezelés szórta meg nagyon.
package jpasample; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class Main { //private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("TopLinkPU"); private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePU"); public static void main(String[] args) { new Main().run(); } public void run(){ EntityManager em = emf.createEntityManager(); SampleEntity entity = em.find(SampleEntity.class,1l); if (entity==null){ System.out.println("nincs ilyen"); entity = new SampleEntity(); entity.setId(1l); em.getTransaction().begin(); try { em.persist(entity); em.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); em.getTransaction().rollback(); } } else { System.out.println("van ilyen"); em.getTransaction().begin(); try { em.remove(entity); em.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); em.getTransaction().rollback(); } } em.close(); } }
És persze kell hozzá még egy descriptor is, hogy melyik Persistence Api implementációt használjuk:
<?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="TopLinkPU" transaction-type="RESOURCE_LOCAL"> <provider> oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider </provider> <class>jpasample.SampleEntity</class> <properties> <!--<property name="toplink.jdbc.url" value="jdbc:derby:asd;create=true"/>--> <property name="toplink.jdbc.url" value="jdbc:derby:asd"/> <property name="toplink.jdbc.user" value=""/> <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="toplink.jdbc.password" value=""/> <!--<property name="toplink.ddl-generation" value="create-tables"/>--> <property name="toplink.jdbc.url" value="jdbc:derby:asd;create=true"/> </properties> </persistence-unit> <persistence-unit name="HibernatePU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>jpasample.SampleEntity</class> <properties> <property name="hibernate.connection.url" value="jdbc:derby:asd;create=true"/> <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="hibernate.connection.password" value=""/> <property name="hibernate.connection.username" value=""/> </properties> </persistence-unit> </persistence>
A NetBeans (5.5 beta 2), amivel ezekenek a kódoknak a nagyrészét generáltam az Oracle TopLink Essential-ját használja. De látható, hogy Hibernate Entity Manager-rel is ment a dolog szépen, csak az EntityManagerFactory konstruktorában kell más persistence-szre hivatkozni. És ez azért nagy királyság: kész a program, de még cserélgethetem a persistence megoldást, hogy megmérjem melyik jobb nekem.
Alapvetően egyébként a JDO is hasonló lehet (múltkor belelapoztam egy könyvbe), elvileg meg is van ígérve, hogy a két speckót egyesítik. De a JPA mellett szól az is, hogy az EJB3 pihepuha Entity Bean-jei is ezt használják.
Nincsenek megjegyzések:
Megjegyzés küldése