Anotace a Hibernate
Transkript
Anotace a Hibernate
Aleš Nosek
Ondřej Vadinský
Daniel Krátký
Anotace v Javě
novinka Javy 5
umožňují k Java kódu přidávat dodatečné
informace (podobně jako JavaDoc)
za předchůdce anotací je možné považovat
XDoclet, který k podobné funkcionalitě
používal právě JavaDoc komentáře
Anotace vs XDoclet
anotace jsou silnější
anotace mohou být použity při kompilaci, ale
mohou být také používány za běhu programu
(pomocí reflexe)
Příklad použití anotací
@Greet(text="Hello everyone")
public class Main {
public static void main(String[] args) {
System.out.println(new
Main().getClass().getAnnotation(Greet.class).text());
}
}
Anotace z Java API
@Deprecated
kompilátor vypíše varování
@Override
programátor by neměl takto označený element
používat
označená metoda má předefinovat metodu předka
pokud to nedělá (chyba programátora) kompilace
skončí chybou
@SupressWarning
pro daný element se nemá generovat specifický
warning
Ukázka
class A {
@Override public boolean equals(A a) { ... }
@Deprecated public void deprecatedMethod() { ... }
}
Kompilátor: „method does not override or implement a
method from a supertype“
Kompilátor: „The method deprecatedMethod() from
the type A is deprecated.“
ORM
Způsob transformace mezi objektovým a
relačním modelem může být definován:
1.Pomocí externího souboru (obvykle ve formátu
XML)
2.Pomocí speciálních JavaDoc komentářů
(v době, kdy nebyly anotace, viz XDoclet)
3.Pomocí anotací
Hibernate 2.x
používá mapovací XML soubory
- lze je generovat automaticky
(např. z existující databáze)
- může jich být velký počet
použití Xdocletu
při buildu vyžaduje jeden krok navíc
(spuštění preprocesoru)
Hibernate 3
použití anotací
zápis mapování přímo ve zdrojovém kódu => při
refactoringu si aplikace snáze zachová
aktuálnost OR mapování
jsou součástí byte kódu a čtou se za běhu
pomocí reflexe => není potřeba žádný externí
XML soubor
podpora nástroji např. IntelliJ IDEA, Eclipse
(doplňování kódu, označení syntaxe)
Použití anotací v Hibernate
Hibernate >= 3.2, Java 5
jar soubory:
hibernate-annotations.jar
(kromě standardních knihoven Hibernate)
lib/ejb3-persistence.jar
(Java Persistence API)
Použití anotací v Hibernate
získání Hibernate session factory:
sessionFactory = new
AnnotationConfiguration().buildSessionFactory();
Použití anotací v Hibernate
Deklarace perzistentních tříd v souboru
hibernate.cfg.xml:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="PlaneType"/>
<mapping class="ModelPlane"/>
</session-factory>
</hibernate-configuration>
Persistentní třídy
POJO = Plain Old Java Object
Třídy s privátními datovými atributy a
příslušnými veřejnými get/set metodami
Anotace upravují persistentní mapování na
tabulky v databázi
Příklad persistentní třídy
@Entity
public class ModelPlane {
private Long id;
@Id
public Long getId()
{
return id;
}
public void setId(Long
id)
{
this.id = id;
}
}
@Entity – Udává, že třída
je persistentní
@Id – označuje unikátní
atribut
Nepersistentní atributy
Anotace @Transient
Udává, že daný atribut se nebude ukládat, ani
načítat z databáze
Všechny ostatní atributy budou automaticky
brány jako persistentní
Zjednodušení oproti mapování přes XML
Generování primárních klíčů
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
Specifikace tabulky a sloupců
Anotace třídy: @Table(name="TABLE")
Udává jméno tabulky, do které se entita ukládá
a ze které se načítá
Anotace metody: @Column(name="COLUMN")
Přidává se ke get metodě daného atributu
Příklad
@Entity
@Table(name="T_MODEL_PLANE")
public class ModelPlane {
private Long id;
private String name;
@Id
@Column(name="PLANE_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="PLANE_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Mapování sloupců
Je možné specifikovat v anotacích mnoho
vlastností spojených s daným sloupcem v
databázi
@Column(name="PLANE_ID", length=80,
nullable=true)
Příklad upřesňuje maximální délku záznamu na
80 znaků a povolenou nullovou hodnotu
Vlastnosti sloupce
@Column(
name="columnName";
boolean unique() default false;
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
int length() default 255;
int precision() default 0;
int scale() default 0;
)
Mapování vztahů
Jedna z nejdůležitějších a nejkomplexnějších
vlastností persistentního mapování
Mapování vztahů mezi tabulkami
Anotace tabulkových vztahů se udávají ke get
metodám
@JoinColumn(name="COLUMN") – název
sloupce, přes který se joinují tabulky
Druhy vztahů
@OneToOne
@ManyToOne
@OneToMany
@ManyToMany
Many-to-one aneb n:1
Jeden z nejčastějších vztahů mezi tabulkami je
many-to-one
@ManyToOne( cascade =
{CascadeType.PERSIST,
CascadeType.MERGE} )
CascadeType udává chování Hibernate při
kaskádových operacích, neboli při mazání
záznamů provázaných cizími klíči
Příklad mapování vztahů
@Entity()
public class Flight implements
Serializable {
private Company company;
@ManyToOne( cascade = CascadeType.PERSIST,
CascadeType.MERGE} )
@JoinColumn(name="COMP_ID")
public Company getCompany() {
return company;
}
...
}
Named query
Slouží k uložení speciálních dotazů
Možno provádět dotazy podle názvu přímo z
kódu
@NamedQueries
@NamedQuery
Příklad named query
@NamedQueries(
{
@NamedQuery(
name="planeType.findById",
query="select p from PlaneType p left join
fetch p.modelPlanes where id=:id"
),
@NamedQuery(
name="planeType.findAll",
query="select p from PlaneType p"
),
@NamedQuery(
name="planeType.delete",
query="delete from PlaneType where
id=:id"
)
}
)
Odkazy
Více informací na:
http://www.hibernate.org/hib_docs/annotations/reference/en
/html_single/
http://www.onjava.com/pub/a/onjava/2007/02/08/anintroduction-to-hibernate-3-annotations.html
http://www.scream.cz/2007/10/28/jemny-uvod-do-anotaci/
http://java.sun.com/j2se/1.5.0/docs/api/
http://en.wikipedia.org/wiki/Hibernate_%28Java%29
Podobné dokumenty
Anotace a Hibernate
public class Main {
public static void main(String[] args) {
System.out.println(new
Main().getClass().getAnnotation(Greet.class).text());
Prezentace ke stažení [PDF - 244 kB]
for (String it : new String[] {"Rod", "Carlos",
"Chris"})
if (it.length() <= 4)
System.out.println(it);
Applet Architektura Java EE - 4 vrstvá CGI
- V zásadě stejné jako ze stand-alone aplikace
- Pokud chceme pracovat se stále stejnou instancí, musíme si jí zapamatovat v session.
- Pozor! Session Bean není HTTP Session
- Nedoporučuje se pouţí...
Nástroje pro vývoj aplikací v závislosti na platformě a jejich vazba na
GNU/Linux – Operační systém vycházející ze systémů unixového typu je postavený na opensource jádru Linux1. Podle tohoto jádra také bývá obvykle zkráceně nazýván.
Určitým specifikem GNU/Linuxu je to...
Září / říjen - Městský úřad Rokytnice nad Jizerou
nedobrovolných dražeb přišlo o pozemek bývalé školní zahrady. Pozemek v rámci dražeb koupil pan Jiří Liška
a pan Jaroslav Budina.
Pozemek zasahuje z horní strany až k objektu základní
školy a leží ...
Návrh webového systému řízení malé společnosti
organizace práce, tak moudré nakládání s informacemi má pozitivní vliv na zisk.
Praktickým prostředkem k dosahování právě popsaného se ukázaly být informační
systémy (IS), což je jen moderní název ...
text práce PDF - Katedra geoinformatiky
Primární impulsem pro téma disertační práce byla diskuze s operačními důstojníky
Hasičského záchranného sboru s nabídkou možné projektové spolupráce na jedné
z konferencí, které se autor zúčastnil ...
S KOMIXem do Evropy
podobného druhu aplikací. Byla vytvořena softwarová
aplikace skládající se ze dvou částí: modulu pro autonomní dávkové provádění jednotlivých činností, které
souvisí se shromažďováním a dalším zpra...