Vysoká škola báňská - technická univerzita Ostrava 17. března 2010
Obsah 1 2 3 4
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
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;
nespojitost public class User{ private String Name; private Address address; public class Address{ private String city; private String country; Table USER: NAME CITY COUNTRY
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)
ostatní identita a rovnost (identity and equality) datové typy
Java Persistence API (JPA)
mapování tříd @Entity public class Student { @Entity(name="anotherStudent") public class Student { @Entity @Table(name="t_student") public class Student {
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);
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;
mapování vlastností @PrePersist @PreUpdate private void validatephonenumber(){ if (telephone.charat(0)!= + ) throw new IllegalArgumentException("Invalid phone number");
mapování vlastností @Transient //nezapise do databaze public int getactive() { return active; @Temporal(TemporalType.TIMESTAMP) //format casu public Date getbirthdate() { return birthdate;
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;
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; BASIC_USER Table ID NAME CREDIT_LIMIT RANK DISCRIMINATOR
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;
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;
dědičnost BASIC_USER Table ID NAME Employee table EMPLOYEE_ID RANK //i primarni i cizi klic
kolekce Table STUDENT STUDENT_ID Table PHONE STUDENT_ID NUMBER
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() {
vazby @Entity @Table(name = "t_customer") public class Customer { @Entity @Table(name = "t_address") public class Address { @Id @GeneratedValue private Long id; private String firstname; private String lastname; private String telephone; private String email; private Integer age; @Id @GeneratedValue private Long id; private String street; private String city; private String zipcode; private String country; private Address homeaddress;
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;
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);
vazby N:M @Entity @Table(name = "t_address") public class Address { @Id private Long id; () @ManyToMany @GeneratedValue (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>(); @Entity @Table(name = "t_tag") public class Tag { @Id private String name; @ManyToMany private List<Address> addresses
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();
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();
struktura tabulky popisující atributy třídy prvků zahrnující body, linie, plochy apod. soubory rastů a rastrové katalogy
typy prvků
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.
dotazy CREATE TABLE address ( address CHAR(80) NOT NULL, address_loc POINT NOT NULL, PRIMARY KEY(address), SPATIAL KEY(address_loc) ); 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) );
dotazy INSERT INTO address VALUES( w 12,GeomFromText( POINT(2671 2500) )); INSERT INTO address VALUES( w 56,GeomFromText( POINT(2971 2520) )); INSERT INTO address VALUES( w 78,GeomFromText( POINT(3171 2510) )); INSERT INTO address VALUES( w 97,GeomFromText( POINT(5671 2530) )); INSERT INTO address VALUES( w 99,GeomFromText( POINT(6271 2460) )); INSERT INTO address VALUES( n 10,GeomFromText( POINT(5673 3520) )); INSERT INTO address VALUES( n 20,GeomFromText( POINT(5665 3550) )); INSERT INTO address VALUES( n 45,GeomFromText( POINT(5571 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) ));
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)
Děkuji za pozornost