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

Содержание

Слайд 2

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

Basics A foreign key can be one or more columns that reference a

Слайд 3

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

Multiplicity in Entity Relationships Multiplicities are of the following types: Many-to-one: Multiple instances

Слайд 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 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

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

Слайд 6

Exercise: Read a Payment

Create a project for read payment data by payment id

with a merchant name instead of merchant id

*

Victor Mozharsky

Exercise: Read a Payment Create a project for read payment data by payment

Слайд 7

CM Database Schema

*

Victor Mozharsky

CM Database Schema * Victor Mozharsky

Слайд 8

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

Payment Entity (1 of 2) @Entity public class Payment { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private

Слайд 9

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

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

Слайд 10

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

DAO & Service Interfaces public interface PaymentDao { public List findByMerchantId(int id); public

Слайд 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 context = new ClassPathXmlApplicationContext("beans.xml");
PaymentService

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

*

Victor Mozharsky

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

Слайд 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 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

PaymentDaoImp Class public List getTotalReport(){ String txt = "SELECT new com.bionic.edu.Result (p.merchant.name, count(p),

Слайд 16

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

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

Слайд 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 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

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

Слайд 19

Exercise: Read a Merchant’s Payments

Create a project for read payment data that correspond

to a merchant given by its id

*

Victor Mozharsky

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

Слайд 20

CM Database Schema

*

Victor Mozharsky

CM Database Schema * Victor Mozharsky

Слайд 21

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

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

Слайд 22

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

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

Слайд 23

Main Class (2 of 2)

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

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

*

Victor Mozharsky

Main Class (2 of 2) System.out.println(" "); Collection payments = m.getPayments(); for (Payment

Слайд 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 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

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

Слайд 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 about merchants whose goods

were bought by a given customer

*

Victor Mozharsky

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

Слайд 28

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

Customer Entity (1 of 2) @Entity public class Customer { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private

Слайд 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 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

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

Слайд 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 of the four relationship

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

*

Victor Mozharsky

Lazy Relationships The fetch mode can be specified on any of the four

Слайд 33

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

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

Слайд 34

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

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

Слайд 35

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

Embedded Objects (2 of 2) We can share the same embedded object type

Слайд 36

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

Embedded Type An embedded type is marked as such by adding the @Embeddable

Слайд 37

Address Embedded Type

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

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

*

Victor Mozharsky

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

Слайд 38

Using an Embedded Object

@Entity
public class Employee {
@Id
private int

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

*

Victor Mozharsky

Using an Embedded Object @Entity public class Employee { @Id private int id;

Слайд 39

Reuse of Embedded Type

An Address class could be reused in both Employee and

Company entities

*

Victor Mozharsky

Reuse of Embedded Type An Address class could be reused in both Employee

Слайд 40

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

Database Schema Generation Automatically generation the tables and database schema for a persistence

Слайд 41

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

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

Слайд 42

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

Schema Generation Practice One of the complaints around schema generation is that you

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