Object-relational mapping (JPA, Hibernate)
Transkript
Object-relational mapping (JPA, Hibernate)
Motivace Problémy JPA, Hibernate Geodatabáze Object-relational mapping (JPA, Hibernate) Ungermann Zbyněk, UNG007 Vysoká škola báňská - technická univerzita Ostrava 17. března 2010 Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Obsah 1 Motivace 2 Problémy 3 JPA, Hibernate 4 Geodatabáze Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Motivace namapovat chování objektového světa do relačních struktur a naopak, tak aby spolu mohli jednoduše komunikovat většina moderních aplikací již s databázemi pracuje rozdílná rozhraní databází vedla k vytvoření JDBC JDBC je však stále relační jazyk oproti tomu, Java je objektově orientovaná ORM se snaží vyřešit neshody mezi těmito přístupy Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Problémy dědičnost public class User{ private String Name; ... } public class Student extends User{ private double credits; ... } public class Teacher extends User{ private int salary; ... } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Problémy nespojitost public class User{ private String Name; private Address address; ... } public class Address{ private String city; private String country; Table USER: NAME CITY COUNTRY ... } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Problémy asociace public class User{ private Address address; ... } public class Address{ private string city; private string country; Table ADDRESS ADDRESS_ID CITY COUNTRY Table USER USER_ID NAME ADDRESS_ID (Fk) ... } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Problémy ostatní identita a rovnost (identity and equality ) datové typy Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate Java Persistence API (JPA) Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate mapování tříd @Entity public class Student { @Entity(name="anotherStudent") public class Student { @Entity @Table(name="t_student") public class Student { Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate mapování identit ... private Long id; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="STUDENT_ID") public Long getId() { return id; } ... student = new Student(); Long studentId = (Long)session.save(student); Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate mapování vlastností @Entity @Table(name = "t_student") public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false) private String firstname; @Column(nullable = false, length = 30) private String lastname; @Column(length = 15) private String telephone; @Column(name = "e_mail") private String email; private Integer age; } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate mapování vlastností @PrePersist @PreUpdate private void validatePhoneNumber(){ if (telephone.charAt(0) != ’+’) throw new IllegalArgumentException("Invalid phone number"); } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate mapování vlastností @Transient //nezapise do databaze public int getActive() { return active; } @Temporal(TemporalType.TIMESTAMP) //format casu public Date getBirthDate() { return birthDate; } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dědičnost @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="DISCRIMINATOR", discriminatorType=DiscriminatorType.STRING) @DiscriminatorValue("USER") @Table(name="BASIC_USER") public class User{ protected long id; protected String name; ... } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dědičnost @Entity @DiscriminatorValue("CUST") public class Customer extends User{ protected double creditLimit; ... } @Entity @DiscriminatorValue("EMP") public class Employee extends User{ protected String rank; ... } Ungermann Zbyněk, UNG007 BASIC_USER Table ID NAME CREDIT_LIMIT RANK DISCRIMINATOR Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dědičnost @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstract class User{ protected long id; protected String name; @Id @GeneratedValue(strategy = GenerationType.AUTO) public long getId() {} ... @Entity public class Customer extends User{ protected double creditLimit; ... Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dědičnost @Entity @Inheritance(strategy=InheritanceType.JOINED) @Table(name="BASIC_USER") public class User implements Serializable{ protected long id; protected String name; ... } @Entity @PrimaryKeyJoinColumn(name="EMPLOYEE_ID") public class Employee extends User{ protected String rank; ... } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dědičnost BASIC_USER Table ID NAME Employee table EMPLOYEE_ID RANK //i primarni i cizi klic Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate kolekce Table STUDENT STUDENT_ID ... Table PHONE STUDENT_ID NUMBER ... Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate kolekce @org.hibernate.annotations.CollectionOfElements (targetElement = java.lang.String.class) @JoinTable( name="PHONE"; joinColumns = @JoinColumn(name="STUDENT_ID")) @Column(name="NUMBER") @org.hibernate.annotations.Sort (type=org.hibernate.annotations.SortType.NATURAL) public Set<String> getPhones() { ... Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate vazby @Entity @Table(name = "t_customer") public class Customer { @Id @GeneratedValue private Long id; private String firstname; private String lastname; private String telephone; private String email; private Integer age; @Entity @Table(name = "t_address") public class Address { @Id @GeneratedValue private Long id; private String street; private String city; private String zipcode; private String country; } private Address homeAddress; } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate vazby 1:1 @Entity @Table(name = "t_customer") public class Customer { @Id @GeneratedValue private Long id; (...) @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "address_fk", nullable = false) private Address homeAddress; } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate vazby 1:M @Entity public abstract class Customer { @Id @GeneratedValue private Long id; (...) @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinTable(name = "t_delivery_addresses", joinColumns = {@JoinColumn(name = "customer_fk")}, inverseJoinColumns = {@JoinColumn(name = "address_fk")}) private List<Address> deliveryAddresses = new ArrayList<Address>(); public void addDeliveryAddress(Address deliveryAddress) { deliveryAddresses.add(deliveryAddress); } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate vazby N:M @Entity @Entity @Table(name = "t_address") @Table(name = "t_tag") public class Address { public class Tag { @Id @GeneratedValue @Id private String name; private Long id; @ManyToMany (...) private List<Address> addresses @ManyToMany } (cascade = CascadeType.PERSIST) @JoinTable(name = "t_address_tag", joinColumns = { @JoinColumn(name = "address_fk")}, inverseJoinColumns = { @JoinColumn(name = "tag_fk")}) private List<Tag> tags = new ArrayList<Tag>(); } Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dotazy // zakazniky se jmenem john Query query = em.createQuery ("SELECT c FROM Customer c WHERE c.firstname=’John’"); List<Customer> customers = query.getResultList(); // to same s pouzitim parametru Query query = em.createQuery ("SELECT c FROM Customer c WHERE c.firstname=:param"); query.setParameter(":param", "John"); List<Customer> customers = query.getResultList(); Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze JPA, Hibernate dotazy // Vsechny adresy z London nebo New York query = em.createQuery ("SELECT a FROM Address a WHERE a.city IN (’London’,’New York’)" addresses = query.getResultList(); // Vsechny adresy s alespon jednim tagem query = em.createQuery ("SELECT a FROM Address a WHERE a.tags IS NOT EMPTY"); addresses = query.getResultList(); // Vsechny adresy s week-end tagem. query = em.createQuery ("SELECT a FROM Address a WHERE :param MEMBER OF a.tags"); query.setParameter("param", new Tag("week-ends")); addresses = query.getResultList(); Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Geodatabáze struktura tabulky popisující atributy třídy prvků zahrnující body, linie, plochy apod. soubory rastů a rastrové katalogy Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Geodatabáze typy prvků Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Geodatabáze typy prvků fromát geodat formát WKT nebo WKB (well-known text/binary) WKT - POINT(10 10), LINESTRING(10 10, 20 20, 30 40), POLYGON((10 10, 10 20, 20 20, 20 15, 10 10)) . . . apod. WKB - 0101000000000000000000F03F000000000000F03F (POINT (1,1)) metody - GeomFromText(wkt,srid), LineFromText(wkt,srid), MPointFromText(wkt,srid) apod. Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Geodatabáze dotazy CREATE TABLE address ( address CHAR(80) NOT NULL, address_loc POINT NOT NULL, PRIMARY KEY(address), SPATIAL KEY(address_loc) ); Ungermann Zbyněk, UNG007 CREATE TABLE cab ( cab_id INT AUTO_INCREMENT NOT NULL, cab_driver CHAR(80) NOT NULL, cab_loc POINT NOT NULL, PRIMARY KEY(cab_id), SPATIAL KEY(cab_loc) ); Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Geodatabáze dotazy INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO address address address address address address address address VALUES(’w VALUES(’w VALUES(’w VALUES(’w VALUES(’w VALUES(’n VALUES(’n VALUES(’n 12’,GeomFromText(’POINT(2671 56’,GeomFromText(’POINT(2971 78’,GeomFromText(’POINT(3171 97’,GeomFromText(’POINT(5671 99’,GeomFromText(’POINT(6271 10’,GeomFromText(’POINT(5673 20’,GeomFromText(’POINT(5665 45’,GeomFromText(’POINT(5571 2500)’)); 2520)’)); 2510)’)); 2530)’)); 2460)’)); 3520)’)); 3550)’)); 3510)’)); INSERT INTO cab VALUES(0,’Joe’,GeomFromText(’POINT(2262 2100)’)); INSERT INTO cab VALUES(0,’Bill’,GeomFromText(’POINT(2441 1980)’)); INSERT INTO cab VALUES(0,’Sam’,GeomFromText(’POINT(5400 3200)’)); Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Geodatabáze dotazy SELECT c.cab_driver, ROUND(GLength(LineStringFromWKB(LineString(AsBinary(c.cab_loc), AsBinary(a.address_loc))))) AS distance FROM cab c, address a WHERE a.address = ’Foobar street 99’ ORDER BY distance ASC LIMIT 1; +------------+----------+ | cab_driver | distance | +------------+----------+ | Sam | 1143 | +------------+----------+ 1 row in set (0.00 sec) Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate) Motivace Problémy JPA, Hibernate Geodatabáze Děkuji za pozornost Ungermann Zbyněk, UNG007 Object-relational mapping (JPA, Hibernate)
Podobné dokumenty
Anotace a Hibernate
Persistentní třídy jsou tídy s privátními datovými atributy a příslušnými get/set
metodami, které se ukládají do databáze. Get/set metody jsou důležité pro
správnou funkčnost hibernate. Pokud není ...
Vybrané partie z jazyka Java Spring a Enterprise JavaBeans (EJB)
Je třeba se vypořádat s transakcemi a perzistencí
jinak
Ferratum Bank – Standardní Podmínky Smlouvy o Úvěru, které se
Produkty a služby
5.1 Pokud Zákazník uzavře Smlouvu o Úvěru, Zákazník může čerpat jakoukoliv částku až do výše
svého Úvěrového Limitu. Úvěr, Příslušné Poplatky, náklady nebo platby budou uhrazeny
v...
Topologické operace ve vybraných software a geodatabázích
nebyl systém schopný zpracovat a spravovat tak obrovské množství dat, jaké projekt obnášel. V počátcích 80. let byly prostorové databáze vyvinuty, aby spojovaly
počítačové mapování s tradičními dat...