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

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í ...

Více

Vybrané partie z jazyka Java Spring a Enterprise JavaBeans (EJB)

Vybrané partie z jazyka Java Spring a Enterprise JavaBeans (EJB) Je třeba se vypořádat s transakcemi a perzistencí  jinak

Více

Ferratum Bank – Standardní Podmínky Smlouvy o Úvěru, které se

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...

Více

Topologické operace ve vybraných software a geodatabázích

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...

Více