3. Java Persistence API. 4. Entity Relationships презентация

Содержание

Слайд 2

Basics A foreign key can be one or more columns

Basics

A foreign key can be one or more columns that reference

a unique key, usually the primary key, in another table
A foreign key and the primary parent key it references must have the same number and type of fields
Foreign keys represents relationships from a column or columns in one table to a column or columns in another table

*

Victor Mozharsky

Слайд 3

Multiplicity in Entity Relationships Multiplicities are of the following types:

Multiplicity in Entity Relationships

Multiplicities are of the following types:
Many-to-one: Multiple instances

of an entity can be related to a single instance of the other entity
One-to-one: Each entity instance is related to a single instance of another entity
One-to-many: An entity instance can be related to multiple instances of the other entities
Many-to-many: The entity instances can be related to multiple instances of each other.

*

Victor Mozharsky

Слайд 4

CM Database Schema * Victor Mozharsky

CM Database Schema

*

Victor Mozharsky

Слайд 5

Many-to-One Mappings A many-to-one mapping is defined by annotating the

Many-to-One Mappings

A many-to-one mapping is defined by annotating the attribute in

the source entity (the attribute that refers to the target entity) with the @ManyToOne annotation
A @JoinColumn(name=Fkname) annotation discribes a foreing key of a relationship

*

Victor Mozharsky

Слайд 6

Exercise: Read a Payment Create a project for read payment

Exercise: Read a Payment

Create a project for read payment data by

payment id with a merchant name instead of merchant id

*

Victor Mozharsky

Слайд 7

CM Database Schema * Victor Mozharsky

CM Database Schema

*

Victor Mozharsky

Слайд 8

Payment Entity (1 of 2) @Entity public class Payment {

Payment Entity (1 of 2)

@Entity
public class Payment {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private

double charge;
private double total;
private String goods;
private java.sql.Date dt;
@ManyToOne
@JoinColumn(name="merchantId")
private Merchant merchant;

*

Victor Mozharsky

Слайд 9

Payment Entity (2 of 2) public Merchant getMerchant(){ return merchant;

Payment Entity (2 of 2)

public Merchant getMerchant(){ return merchant; }
public void

setMerchant(Merchant value){
merchant = value;
}
. . . . . . . . . . . . . . . .
public String getStringForPrint() {
String txt = "id = " + id + "; date = ";
SimpleDateFormat dtFrm = new SimpleDateFormat("dd.MM.yyyy");
txt += dtFrm.format(dt) + "; merchant = " + merchant.getName();
txt += "; total = " + total + "; charge = " + charge;
return txt;
}

*

Victor Mozharsky

Слайд 10

DAO & Service Interfaces public interface PaymentDao { public List

DAO & Service Interfaces

public interface PaymentDao {
public List findByMerchantId(int id);
public double

getPaymentSum();
public Payment findById(int id);
}
public interface PaymentService {
public List findByMerchantId(int id);
public double getPaymentSum();
public Payment findById(int id);
}

*

Victor Mozharsky

Слайд 11

PaymentDaoImpl Class public Payment findById(int id){ return em.find(Payment.class, id); } * Victor Mozharsky

PaymentDaoImpl Class

public Payment findById(int id){
return em.find(Payment.class, id);
}

*

Victor Mozharsky

Слайд 12

Main Class @SuppressWarnings("resource") public static void main(String[] args) { ApplicationContext

Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new

ClassPathXmlApplicationContext("beans.xml");
PaymentService paymentService = context.getBean(PaymentService.class);
Payment p = paymentService.findById(2);
System.out.println(p.toString());
}

*

Victor Mozharsky

Слайд 13

Exercise: Read a Payment See P351ReadPayment project for the full text * Victor Mozharsky

Exercise: Read a Payment

See P351ReadPayment project for the full text

*

Victor Mozharsky

Слайд 14

Exercise: Group Payments Modify P237Grouping project using entities from the previous project * Victor Mozharsky

Exercise: Group Payments

Modify P237Grouping project using entities from the previous project

*

Victor

Mozharsky
Слайд 15

PaymentDaoImp Class public List getTotalReport(){ String txt = "SELECT new

PaymentDaoImp Class

public List getTotalReport(){
String txt = "SELECT new com.bionic.edu.Result

(p.merchant.name, count(p), SUM(p.chargePayed))";
txt += "FROM Payment p GROUP BY p.merchant.name";
TypedQuery query = em.createQuery(txt, Result.class);
return query.getResultList();
}

*

Victor Mozharsky

Слайд 16

Main Class @SuppressWarnings("resource") public static void main(String[] args) { ApplicationContext

Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new

ClassPathXmlApplicationContext("beans.xml");
PaymentService paymentService = context.getBean(PaymentService.class);
List list = paymentService.getTotalReport();
for(Result r: list)
System.out.format("%1$25s %2$3d %3$8.2f \n", r.getName(), r.getCount(), r.getSum());
}

*

Victor Mozharsky

Слайд 17

Exercise: Group Payments See P352GroupPayment project for the full text * Victor Mozharsky

Exercise: Group Payments

See P352GroupPayment project for the full text

*

Victor Mozharsky

Слайд 18

One-to-Many Mappings An entity instance can be related to multiple

One-to-Many Mappings

An entity instance can be related to multiple instances of

the other entities
One-to-many relationships use the @OneToMany annotation on the corresponding persistent property or field
The mappedBy element is needed to refer to the attribute annotated by ManyToOne in the corresponding entity:
@OneToMany(mappedBy=“attribute”)
A one-to-many association needs to map the collection of entities

*

Victor Mozharsky

Слайд 19

Exercise: Read a Merchant’s Payments Create a project for read

Exercise: Read a Merchant’s Payments

Create a project for read payment data

that correspond to a merchant given by its id

*

Victor Mozharsky

Слайд 20

CM Database Schema * Victor Mozharsky

CM Database Schema

*

Victor Mozharsky

Слайд 21

Merchant Entity @Entity public class Merchant { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private

Merchant Entity

@Entity
public class Merchant {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private double

charge;
private int period;
private double total;
@OneToMany(mappedBy="merchant")
private Collection payments;

*

Victor Mozharsky

Слайд 22

Main Class (1 of 2) @SuppressWarnings("resource") public static void main(String[]

Main Class (1 of 2)

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext

context = new ClassPathXmlApplicationContext("beans.xml");
MerchantService merchantService = context.getBean(MerchantService.class);
List list = merchantService.getSortedByNeedToPay();
for(Merchant m: list){
System.out.println("=======================");
System.out.println(m.getName());

*

Victor Mozharsky

Слайд 23

Main Class (2 of 2) System.out.println(" "); Collection payments =

Main Class (2 of 2)

System.out.println(" ");
Collection payments = m.getPayments();
for (Payment p

: payments) {
System.out.println(p.toString());
}
}
}

*

Victor Mozharsky

Слайд 24

Exercise: Read a Merchant’s Payments See P353MerchantPayments project for the full text * Victor Mozharsky

Exercise: Read a Merchant’s Payments

See P353MerchantPayments project for the full text

*

Victor

Mozharsky
Слайд 25

Many-to-Many Mappings The entity instances can be related to multiple

Many-to-Many Mappings

The entity instances can be related to multiple instances of

each other
Many-to-many relationships use the @ManyToMany annotation on the corresponding persistent property or field
We must use a third table to associate the two entity types (join table)

*

Victor Mozharsky

Слайд 26

@JoinTable Annotation @JoinTable(name=“table name”, joinColumns=@JoinColumn(name=“c1Id”), inverseJoinColumns= @JoinColumn(name=“c2Id”)) * Victor Mozharsky

@JoinTable Annotation

@JoinTable(name=“table name”,
joinColumns=@JoinColumn(name=“c1Id”),
inverseJoinColumns=
@JoinColumn(name=“c2Id”))

*

Victor Mozharsky

Слайд 27

Exercise: Read Customer’s Merchants Create a project to read data

Exercise: Read Customer’s Merchants

Create a project to read data about merchants

whose goods were bought by a given customer

*

Victor Mozharsky

Слайд 28

Customer Entity (1 of 2) @Entity public class Customer {

Customer Entity (1 of 2)

@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private

java.sql.Date maturity;
private String ccType;
private String ccNo;
private String eMail;
private String address;
private String name;

*

Victor Mozharsky

Слайд 29

Customer Entity (2 of 2) @ManyToMany @JoinTable(name="Payment", joinColumns=@JoinColumn(name="customerId"), inverseJoinColumns=@JoinColumn(name="merchantId")) private Collection merchants; * Victor Mozharsky

Customer Entity (2 of 2)

@ManyToMany
@JoinTable(name="Payment", joinColumns=@JoinColumn(name="customerId"),
inverseJoinColumns=@JoinColumn(name="merchantId"))
private Collection merchants;

*

Victor Mozharsky

Слайд 30

Main Class @SuppressWarnings("resource") public static void main(String[] args) { ApplicationContext

Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new

ClassPathXmlApplicationContext("beans.xml");
CustomerService customerService = context.getBean(CustomerService.class);
Customer customer = customerService.findById(1);
if (customer != null){
System.out.println(customer.toString());
Collection merchants = customer.getMerchants();
for (Merchant m : merchants) { System.out.println(m.getName());}}}

*

Victor Mozharsky

Слайд 31

Exercise: Read Customer’s Merchants See P354CustAndMerch project for the full text * Victor Mozharsky

Exercise: Read Customer’s Merchants

See P354CustAndMerch project for the full text

*

Victor Mozharsky

Слайд 32

Lazy Relationships The fetch mode can be specified on any

Lazy Relationships

The fetch mode can be specified on any of the

four relationship mapping types:
@ManyToOne(fetch=FetchType.LAZY)
Lazy loading can essential enhance performance

*

Victor Mozharsky

Слайд 33

One-to-One Mappings Each entity instance is related to a single

One-to-One Mappings

Each entity instance is related to a single instance of

another entity
One-to-one relationships use the @OneToOne annotation on the corresponding persistent property or field
Example of One-To-One mapping: Employee and ParkingSpace entities

*

Victor Mozharsky

Слайд 34

Embedded Objects (1 of 2) An embedded object is one

Embedded Objects (1 of 2)

An embedded object is one that is

dependent on an entity for its identity
It has no identity of its own, but is merely part of the entity state
The state of the embedded object is stored with the rest of the entity state in the database row, with no distinction between the state in the Java entity and that in its embedded object

*

Victor Mozharsky

Слайд 35

Embedded Objects (2 of 2) We can share the same

Embedded Objects (2 of 2)

We can share the same embedded object

type with other entities that also have the same internal representation
Example: the home address of the employee (contains Street, City, State, ZipCode fields)

*

Victor Mozharsky

Слайд 36

Embedded Type An embedded type is marked as such by

Embedded Type

An embedded type is marked as such by adding the

@Embeddable annotation to the class definition
Its fields and properties will be persistable as part of an entity
We might also want to define the access type of the embeddable object so it is accessed the same way regardless of which entity it is embedded in

*

Victor Mozharsky

Слайд 37

Address Embedded Type @Embeddable @Access(AccessType.FIELD) public class Address { private

Address Embedded Type

@Embeddable
@Access(AccessType.FIELD)
public class Address {
private String

street;
private String city;
private String state;
private String zipCode;
// ...
}

*

Victor Mozharsky

Слайд 38

Using an Embedded Object @Entity public class Employee { @Id

Using an Embedded Object

@Entity
public class Employee {
@Id

private int id;
private String name;
private long salary;
@Embedded
private Address address;
// ...
}

*

Victor Mozharsky

Слайд 39

Reuse of Embedded Type An Address class could be reused

Reuse of Embedded Type

An Address class could be reused in both

Employee and Company entities

*

Victor Mozharsky

Слайд 40

Database Schema Generation Automatically generation the tables and database schema

Database Schema Generation

Automatically generation the tables and database schema for a

persistence unit can be done through the "eclipselink.ddl-generation" persistence unit property
The tables and constraints will be generated for all of the classes defined in that persistence unit.

*

Victor Mozharsky

Слайд 41

eclipselink.ddl-generation Values create-tables – if the table already exists then

eclipselink.ddl-generation Values

create-tables – if the table already exists then it will

not be dropped or replaced, the existing table will be used
drop-and-create-tables - will first drop the existing table, and then create the new table. Note that this will lose all of the data in the tables when they are dropped!!

*

Victor Mozharsky

Слайд 42

Schema Generation Practice One of the complaints around schema generation

Schema Generation Practice

One of the complaints around schema generation is that

you can’t specify everything that you need to be able to finely tune the schema.
There are too many differences between databases and too many different settings to try to put in options for every database type.

*

Victor Mozharsky

Имя файла: 3.-Java-Persistence-API.-4.-Entity-Relationships.pptx
Количество просмотров: 224
Количество скачиваний: 0