<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.multimediaexpo.cz/mmecz/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Java_Persistence_API</id>
		<title>Java Persistence API - Historie editací</title>
		<link rel="self" type="application/atom+xml" href="http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Java_Persistence_API"/>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Java_Persistence_API&amp;action=history"/>
		<updated>2026-04-29T14:21:08Z</updated>
		<subtitle>Historie editací této stránky</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Java_Persistence_API&amp;diff=503324&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Java_Persistence_API&amp;diff=503324&amp;oldid=prev"/>
				<updated>2014-01-22T09:56:00Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Starší verze&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Verze z 22. 1. 2014, 09:56&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Java_Persistence_API&amp;diff=503323&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Java_Persistence_API&amp;diff=503323&amp;oldid=prev"/>
				<updated>2010-10-21T09:17:46Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''Java Persistence API''' (JPA) je [[framework]] [[Java (programovací jazyk)|programovacího jazyka Java]], který umožňuje [[objektově relační mapování]] (ORM). To usnadňuje práci s ukládáním objektů do databáze a naopak. Je určen jak pro [[Java SE]], tak pro [[Java EE]].&amp;lt;ref&amp;gt;[http://java.sun.com/javaee/technologies/persistence.jsp Sun's Java Persistence API]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Entity ==&lt;br /&gt;
Entita je objekt, který reprezentuje data v databázi. Typicky entitní [[Třída (programování)|třída]] reprezentuje tabulku v relační databázi a každá instance této třídy pak koresponduje k jedné řádce tabulky.&amp;lt;ref&amp;gt;[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqa.html &amp;quot;Entities - The Java EE 5 Tutorial&amp;quot;].&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Požadavky pro entitní třídu ===&lt;br /&gt;
&lt;br /&gt;
Aby mohly být entity persistovány, musí mít entitní třída následující vlastnosti&amp;lt;ref&amp;gt;[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqa.html#bnbqb &amp;quot;Requirements for Entity Classes - The Java EE 5 Tutorial&amp;quot;].&amp;lt;/ref&amp;gt;:&lt;br /&gt;
*Musí být anotována anotací javax.persistence.Entity&lt;br /&gt;
*Musí mít public nebo protected [[konstruktor]] bez parametrů. Může ale mít i další konstruktory.&lt;br /&gt;
*Nesmí být deklarována jako final. To platí i pro její metody.&lt;br /&gt;
*Pokud session beana bude pracovat s instancemi této třídy a bude typu Remote, potom tato entitní třída musí implementovat interface Serializable&lt;br /&gt;
*Může dědit z entitní i ne-entitní třídy. &lt;br /&gt;
*Její atributy musí být deklarovány jako private, protected nebo package-private a lze k nim přistupovat pouze přes metody (gettery a settery). &lt;br /&gt;
&lt;br /&gt;
=== Povolené typy atributů ===&lt;br /&gt;
&lt;br /&gt;
Aby mohla být entita uložena do databáze, musí mít atributy pouze následujících typů:&amp;lt;ref&amp;gt;[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqa.html#bnbqc &amp;quot;Persistent Fields and Properties in Entity Classes&amp;quot;].&amp;lt;/ref&amp;gt;&lt;br /&gt;
*primitivní typy&lt;br /&gt;
*java.lang.String&lt;br /&gt;
*Wrapper třídy primitivních typů&lt;br /&gt;
*java.math.BigInteger&lt;br /&gt;
*java.math.BigDecimal&lt;br /&gt;
*java.util.Date&lt;br /&gt;
*java.util.Calendar&lt;br /&gt;
*java.sql.Date&lt;br /&gt;
*java.sql.Time&lt;br /&gt;
*java.sql.TimeStamp&lt;br /&gt;
*byte[]&lt;br /&gt;
*Byte[]&lt;br /&gt;
*char[]&lt;br /&gt;
*Character[]&lt;br /&gt;
*Enumerační typy&lt;br /&gt;
*Jiné entity a/nebo kolekce entit&lt;br /&gt;
*Třídy s anotací Embeddable&lt;br /&gt;
&lt;br /&gt;
=== Životní cyklus entity ===&lt;br /&gt;
Každá entita má svůj určitý stav, ve kterém se nachází. Ten je rozhodnut instancí třídy EntityManger. Entita se pohybuje mezi jednotlivými stavy vždy po provedení určité akce EntityMangerem. Startovním stavem entity je vždy New/Transient, žádný stav není konečný. Všechny stavy entity a hrany mezi nimi vystihuje následující graf: &amp;lt;ref&amp;gt;[http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/jpa_overview_em_lifecycle.html &amp;quot;Apache OpenJPA User's Guide - Entity Lifecycle Management&amp;quot;].&amp;lt;/ref&amp;gt;&lt;br /&gt;
[[Soubor:EntityLifeCycle.png‎ ||Entity life cycle]]&lt;br /&gt;
&lt;br /&gt;
=== Multiplicity ===&lt;br /&gt;
&lt;br /&gt;
Existují 4 typy multiplicit v entitních třídách:&lt;br /&gt;
*'''One-to-one:''' instance má referenci na jednu entitu jiné třídy.&lt;br /&gt;
*'''One-to-many:''' instance má reference na množinou instancí jiné třídy.&lt;br /&gt;
*'''Many-to-one:''' více instancí má referenci na jednu instanci jiné třídy. &lt;br /&gt;
*'''Many-to-many:''' více instancí má reference na instance jiné třídy.&lt;br /&gt;
Dále existují 2 typy direction:&lt;br /&gt;
*'''Unidirectional:''' instance má referenci na jiný objekt, ten ovšem nemá referenci zpět. &lt;br /&gt;
*'''Bidirectional:''' instance má referenci na jiný objekt a ten má také referenci zpět. Vidí se navzájem.&lt;br /&gt;
&lt;br /&gt;
== Persistence Context ==&lt;br /&gt;
Entity jsou spravovány objektem třídy EntityManager. Chceme-li ho získat v SessionBeaně, musíme deklarovat atribut typu EntityManager a anotovat ho pomocí PersistenceContext. &lt;br /&gt;
&lt;br /&gt;
=== Základní metody EntityManageru pro práci s objekty ===&lt;br /&gt;
&lt;br /&gt;
Předpokládejme, že máme definován EntityManager s názvem em  a entitu s názvem entita:&lt;br /&gt;
*'''em.persist(entita):''' uloží objekt entita do databáze (operace INSERT)&lt;br /&gt;
*'''em.remove(entita):''' smaže objekt entita z databáze (operace DELETE)&lt;br /&gt;
*'''em.merge(entita):''' entita byla persistována, ale následně byla změněna. Po operaci merge se tyto změny projeví v databázi (operace UPDATE).&lt;br /&gt;
*'''em.find(class,id):''' vrátí objekt v tabulce, která koresponduje s class a má primární klíč id (operace SELECT)&lt;br /&gt;
&lt;br /&gt;
== Transakce ==&lt;br /&gt;
Veškeré operace spojené s přístupem do [[Relační databáze|databáze]] (operace INSERT, DELETE, UPDATE apod.) jsou prováděny uvnitř metod v Enterprise Java Beanách pomocí instance třídy EntityManager. Celá tato metoda je pak brána jako jedna [[Databázová transakce|ACID transakce]]. To mimojiné znamená, že pokud dojde k provedení celé metody bez vyhození výjimky, bude zavoláno commit a celá transakce se potvrdí. Naopak, pokud dojde k vyhození výjimky, je zavoláno rollback a co se doposud provedlo bude vráceno a databáze tak zůstane v původním konzistentím stavu.&lt;br /&gt;
&lt;br /&gt;
Nicméně je také možné se starat o transakce ručně:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @PersistenceContext&lt;br /&gt;
    private EntityManager em;&lt;br /&gt;
&lt;br /&gt;
    public void foo(){&lt;br /&gt;
        EntityTransaction ut=null;&lt;br /&gt;
        try{&lt;br /&gt;
            ut=em.getTransaction();&lt;br /&gt;
            ut.begin();&lt;br /&gt;
            //do work&lt;br /&gt;
            ut.commit();&lt;br /&gt;
        } catch(Exception ex){&lt;br /&gt;
            ut.rollback();&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Java Persistence Query Language ==&lt;br /&gt;
&lt;br /&gt;
EntityManager umí vytvářet dotazy podobné SQL dotazům. Využívá se zde ovšem  '''Java Persistence Query Language'''&amp;lt;ref&amp;gt;[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbtg.html &amp;quot;The Java Persistence Query Language - The Java 5 EE Tutorial&amp;quot;].&amp;lt;/ref&amp;gt;, což je jazyk podobný SQL a jeho použití  má tu výhodu, že dotazy jsou nezávislé na zvolené technologii databáze (Oracle, Microsoft…). Navíc mají objektové vlastnosti, takže v dotazech nezmiňujeme konkrétní názvy tabulek databáze či jejich vlastností, nýbrž v dotazech uvádíme přímo názvy tříd/atributů, k porovnávání můžeme využívat i referencí objektů.&lt;br /&gt;
&lt;br /&gt;
== Implementace JPA ==&lt;br /&gt;
&lt;br /&gt;
'''Java Persistence API''' je pouze specifikací, nicméně není to samotná implementace, která by se dala použít. Mezi implementace JPA patří tyto produkty:&lt;br /&gt;
*Oracle Toplink&lt;br /&gt;
*Hibernate&lt;br /&gt;
*OpenJPA&lt;br /&gt;
&lt;br /&gt;
== Příklad ==&lt;br /&gt;
Máme majitele (''Owner''), který může mít několik aut (''Car''). Dále předpokládejme, že každé auto může mít vždy pouze jednoho majitele a že u auta je majitel uveden (použijeme biderectional relationship - oboustranný vztah).&lt;br /&gt;
&lt;br /&gt;
=== Třída ''Owner'' ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity&lt;br /&gt;
public class Owner implements Serializable {&lt;br /&gt;
&lt;br /&gt;
    private static final long serialVersionUID = 1L;&lt;br /&gt;
    @Id&lt;br /&gt;
    @GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt;
    private Long id;&lt;br /&gt;
    private String name;&lt;br /&gt;
    @OneToMany(mappedBy = &amp;quot;owner&amp;quot;)&lt;br /&gt;
    private List&amp;lt;Car&amp;gt; car;&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Car&amp;gt; getCar() {&lt;br /&gt;
        return car;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCar(List&amp;lt;Car&amp;gt; car) {&lt;br /&gt;
        this.car = car;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setName(String name) {&lt;br /&gt;
        this.name = name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Long getId() {&lt;br /&gt;
        return id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setId(Long id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public int hashCode() {&lt;br /&gt;
        int hash = 0;&lt;br /&gt;
        hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;
        return hash;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean equals(Object object) {&lt;br /&gt;
        if (!(object instanceof Owner)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        Owner other = (Owner) object;&lt;br /&gt;
        if ((this.id == null &amp;amp;&amp;amp; other.id != null) || (this.id != null &amp;amp;&amp;amp; !this.id.equals(other.id))) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;Owner[id=&amp;quot; + id + &amp;quot;]&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Třída ''Car'' ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Entity&lt;br /&gt;
public class Car implements Serializable {&lt;br /&gt;
&lt;br /&gt;
    private static final long serialVersionUID = 1L;&lt;br /&gt;
    @Id&lt;br /&gt;
    @GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt;
    private Long id;&lt;br /&gt;
    private String color;&lt;br /&gt;
    @ManyToOne&lt;br /&gt;
    private Owner owner;&lt;br /&gt;
&lt;br /&gt;
    public String getColor() {&lt;br /&gt;
        return color;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setColor(String color) {&lt;br /&gt;
        this.color = color;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Owner getOwner() {&lt;br /&gt;
        return owner;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setOwner(Owner owner) {&lt;br /&gt;
        this.owner = owner;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Long getId() {&lt;br /&gt;
        return id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setId(Long id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public int hashCode() {&lt;br /&gt;
        int hash = 0;&lt;br /&gt;
        hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;
        return hash;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean equals(Object object) {&lt;br /&gt;
        if (!(object instanceof Car)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        Car other = (Car) object;&lt;br /&gt;
        if ((this.id == null &amp;amp;&amp;amp; other.id != null) || (this.id != null &amp;amp;&amp;amp; !this.id.equals(other.id))) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;Car[id=&amp;quot; + id + &amp;quot;]&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Session Bean ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Stateless&lt;br /&gt;
public class ExampleEjbBean implements ExampleEjbLocal {&lt;br /&gt;
    @PersistenceContext&lt;br /&gt;
    EntityManager em;&lt;br /&gt;
&lt;br /&gt;
    public void saveOwner(Owner owner) {&lt;br /&gt;
        em.persist(owner);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Owner getOwner(Long id) {&lt;br /&gt;
        return (Owner) em.find(Owner.class, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Související články ==&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Databáze]]&lt;br /&gt;
* [[LINQ]]&lt;br /&gt;
* [[Objektově orientované programování]]&lt;br /&gt;
* [[Java EE]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Externí odkazy ==&lt;br /&gt;
*[http://java.sun.com/javaee/5/docs/tutorial/doc/ The Java EE 5 Tutorial]&lt;br /&gt;
*[http://java.sun.com/javaee/technologies/persistence.jsp Sun's Java Persistence API]&lt;br /&gt;
*[http://download.oracle.com/docs/cd/B32110_01/web.1013/b28221/undejbs003.htm What is JPA entity?]&lt;br /&gt;
*[http://java.sun.com/javaee/5/docs/api/javax/persistence/package-summary.html Java Persistence API JavaDoc]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Článek z Wikipedie}}&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Objektově orientované programování]]&lt;/div&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	</feed>