51
1 / 51 Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University Database Programming Chapter 4. Collections and Associations Collections Associations

Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

1 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Chapter 4. Collections and Associations

Collections

Associations

Page 2: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

2 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Java Variable and Collection

class Person {

Long id;

Address address;

}

class Address {

Long id;

Set<Person> persons = new HashSet<Person>;

}

Page 3: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

3 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Java Collections

Java Collections

Implementations

Interfaces

HashTable

ResizableArray Tree Linked

ListHash Table +Linked List

Set HashSet TreeSet LinkedHashSetList ArrayList LinkedList

QueueDeque ArrayDeque LinkedListMap HashMap TreeMap LinkedHashMap

Page 4: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

4 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional Associations

Page 5: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

5 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional Many-to-One/One-to-Many Associations 1/3

Person

id

Address

id*persons

1address

PersonAddress

class Person {Long id;Address address;

}

class Address {Long id;Set<Person> persons =

new HashSet<Person>;}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Page 6: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

6 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional Many-to-One/One-to-Many Associations 2/3

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<many-to-one name="address"class="Address"column="addressId"not-null="true" />

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

<set name="persons" inverse="true"><key column="addressId"/><one-to-many class="Person"/>

</set>

</class>

class Person {Long id;Address address;

}

class Address {Long id;Set<Person> persons =

new HashSet<Person>;}

create table Address (addressId bigint not null primary key

generated by default as identity)

create table Person (personId bigint not null primary key

generated by default as identity,addressId bigint not null

)

Page 7: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

7 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping (detail)

Bidirectional Many-to-One/One-to-Many Associations 3/3

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<many-to-one name="address"class="Address"column="addressId"not-null="true" />

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

<set name="persons" inverse="true"><key column="addressId"/><one-to-many class="Person"/>

</set>

</class>

class Person {Long id;Address address;

}

class Address {Long id;Set<Person> persons =

new HashSet<Person>;}

create table Address (addressId bigint not null primary key

generated by default as identity)

create table Person (personId bigint not null primary key

generated by default as identity,addressId bigint not null

)

Page 8: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

8 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional Many-to-Many Associations 1/2

Person

id

Address

id*persons

*addresses

PersonAddress

create table PersonAddress ( personId bigint not null,addressId bigint not null,primary key (personId, addressId)

)

class Person {Long id;Set<Address> addresses =

new HashSet<Address>;}

class Address {Long id;Set<Person> persons =

new HashSet<Person>;}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

Page 9: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

9 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional Many-to-Many Associations 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<set name="addresses" table="PersonAddress"><key column="personId"/><many-to-many class="Address"

column="addressId"/></set>

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

<set name="persons" table="PersonAddress"inverse="true">

<key column="addressId"/><many-to-many class="Person"

column="personId"/></set>

</class>

create table Person ( personId bigint not null primary key )create table PersonAddress (

personId bigint not null,addressId bigint not null,primary key (personId, addressId)

)create table Address ( addressId bigint not null primary key )

class Person {Long id;Set<Address> addresses =

new HashSet<Address>;}

class Address {Long id;Set<Person> persons =

new HashSet<Person>;}

Page 10: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

10 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional One-to-One Associations on a Foreign Key 1/2

Person

id

Address

id1person

1address

PersonAddress

class Person {Long id;Address address;

}

class Address {Long id;Person person;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Page 11: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

11 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional One-to-One Associations on a Foreign Key 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<many-to-one name="address"

class="Address"

column="addressId"

unique="true"

not-null="true" />

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

<one-to-one name="person"

property-ref="address"/>

</class>

property-ref (optional):the name of a property of the associated class that

is joined to the primary key of this classIf not specified, the primary key of the associated class is used.

class Person {Long id;Address address;

}

class Address {Long id;Person person;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Page 12: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

12 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional One-to-One Associations on a Primary Key 1/2

Person

id

Address

id1person

1address

PersonAddress

class Person {Long id;Address address;

}

class Address {Long id;Person person;

}

create table Address (personId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

Page 13: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

13 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Bidirectional One-to-One Associations on a Primary Key 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<one-to-one name="address" cascade=“all”/>

</class>

class Person {Long id;Address address;

}

class Address {Long id;Person person;

}

create table Address (personId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

<class name="Address">

<id name="id" column="personId">

<generator class="foreign">

<param name="property">person</param>

</generator>

</id>

<one-to-one name="person" constrained="true"/></class>

constrained (optional): specifies that a foreign key constraint on the primary key of the mapped table and references the table of the associated class

Page 14: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

14 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional Associations

Page 15: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

15 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional Many-to-One Associations 1/2

class Person {Long id;Address address;

}

class Address {Long id;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Person

id

Address

id*persons

1address

PersonAddress

Page 16: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

16 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional Many-to-One Associations 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<many-to-one name="address" column="addressId" not-null="true" />

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

</class>

class Person {Long id;Address address;

}

class Address {Long id;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Page 17: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

17 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional One-to-Many Associations (unusual case) 1/2

Person

id

Address

id1person

*addresses

PersonAddress

class Person {Long id;Set<Address> addresses;

}

class Address {Long id;

}

create table Address (addressId bigint not null primary key,personId bigint not null

)

create table Person (personId bigint not null primary key

)

Page 18: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

18 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional One-to-Many Associations (unusual case) 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<set name="addresses">

<key column="personId" not-null="true"/>

<one-to-many class="Address"/>

</set>

</class>

<class name="Address">

<id name="id" column=“addressId">

<generator class=“native">

</id>

</class>

class Person {Long id;Set<Address> addresses;

}

class Address {Long id;

}

create table Address (addressId bigint not null primary key,personId bigint not null

)

create table Person (personId bigint not null primary key

)

Page 19: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

19 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional Many-to-Many Associations 1/2

Person

id

Address

id*persons

*addresses

PersonAddress

create table PersonAddress ( personId bigint not null,addressId bigint not null,primary key (personId, addressId)

)

class Person {Long id;Set<Address> addresses =

new HashSet<Address>;}

class Address {Long id;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

Page 20: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

20 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional Many-to-Many Associations 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<set name="addresses" table="PersonAddress">

<key column="personId"/>

<many-to-many class="Address" column="addressId" />

</set>

</class>

<class name="Address">

<id name="id" column=“addressId">

<generator class=“native">

</id>

</class>

create table PersonAddress ( personId bigint not null,addressId bigint not null,primary key (personId, addressId)

)

class Person {Long id;Set<Address> addresses =

new HashSet<Address>;}

class Address {Long id;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

Page 21: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

21 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional One-to-One Associations on a Foreign Key 1/2

Person

id

Address

id1person

1address

PersonAddress

class Person {Long id;Address address;

}

class Address {Long id;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Page 22: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

22 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional One-to-One Associations on a Foreign Key 2/2

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<many-to-one name="address"

class="Address"

column="addressId"

unique="true"

not-null="true" />

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

</class>

class Person {Long id;Address address;

}

class Address {Long id;

}

create table Address (addressId bigint not null primary key

)

create table Person (personId bigint not null primary key,addressId bigint not null

)

Page 23: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

23 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional One-to-One Associations on a Primary Key 1/2

Person

id

Address

id1person

1address

PersonAddress

class Person {Long id;

}

class Address {Long id;Person person;

}

create table Address (personId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

Page 24: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

24 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping

Unidirectional One-to-One Associations on a Primary Key 2/2

<class name="Person">

<id name="id" column="personId">

<generator class=“native“/>

</id>

</class>

class Person {Long id;

}

class Address {Long id;Person person;

}

create table Address (personId bigint not null primary key

)

create table Person (personId bigint not null primary key,

)

<class name="Address">

<id name="id" column="personId"><generator class=“foreign“>

<param name=“property”>person</param>

</generator>

</id>

<one-to-one name=“person" constrained=“true”/>

</class>

Page 25: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

25 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Association and Mapping Exercise

hibernate-369-mkyong-win

– 01-stock-quickstart-xml

– 03-stock-onetomany-xml

– 05-stock-manytomany-xml

– 08-stock-onetoone-xml

Page 26: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

26 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Exercise #4: Generate hbm.xml of Employee and Company

ex04/src/main/java/com/oreilly/hh/data/Employee.hbm.xml:

<hibernate-mapping>

<class name="com.oreilly.hh.data.Employee" …>

<id name="id" …>

</id>

</class>

</hibernate-mapping>

ex04/src/main/java/com/oreilly/hh/data/Company.hbm.xml:

<hibernate-mapping>

<class name="com.oreilly.hh.data.Company" …>

<id name="id" …>

</id>

</class>

</hibernate-mapping>

Page 27: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

27 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Exercise #4: test

$ gradle test

:ex04:test

Results: SUCCESS (3 tests, 3 successes, 0 failures, 0 skipped)

BUILD SUCCESSFUL

Page 28: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

28 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Java Collections vs Database Relationships …

Bidirectional Many-to-Many Associations

Artist

idname

Track

idtitlefilePathplayTimeaddedvolume

0..*artists

0..*tracks

track_artists

class Artist {

Integer id;

String name;

Set<Track> tracks;

}

class Track {

Integer id;

String title;

String filePath;

time playTime;

date added;

short volume;

Set<Artist> artists;

}

UML

Java

Page 29: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

29 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Java Collections vs Database Relationships …

Unidirectional Many-to-Many Associations

Artist

idname

Track

idtitlefilePathplayTimeaddedvolume

0..*tracks

track_artists

class Artist {

Integer id;

String name;

Set<Track> tracks;

}

class Track {

Integer id;

String title;

String filePath;

time playTime;

date added;

short volume;

}

UML

Java

Page 30: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

30 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Java Collections vs Database Relationships

Many-to-Many Associations and Database Relationships

create table ARTIST (

id integer primary key,

name varchar(62)

)

create table TRACK (

id integer primary key,

title varchar(62),

filePath varchar(62),

playTime time,

added date,

volume smallint

)

UML

Tablecreate table TRACK_ARTISTS (

artist_id integer,

track_id integer,

foreign key (artist_id) references artist(id),

foreign key (track_id) references track(id)

)

Artist

idname

Track

idtitlefilePathplayTimeaddedvolume

0..*tracks

track_artists0..*

artists

Page 31: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

31 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Mapping Collections (for Bidirectional Many-to-Many Association)

Artist

idname

Track

idtitlefilePathplayTimeaddedvolume

0..*tracks

track_artists0..*

artists

<set name="tracks" table="TRACK_ARTISTS" inverse="true">

<key column="ARTIST_ID“ />

<many-to-many class="com.oreilly.hh.data.Track" column="TRACK_ID"/>

</set>

<set name="artists" table="TRACK_ARTISTS">

<key column="TRACK_ID"/>

<many-to-many class="com.oreilly.hh.data.Artist" column="ARTIST_ID"/>

</set>

Page 32: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

32 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Mapping Collections (for Unidirectional Many-to-Many Association)

Artist

idname

Track

idtitlefilePathplayTimeaddedvolume

0..*tracks

track_artists

<set name="tracks" table="TRACK_ARTISTS">

<key column="ARTIST_ID“ />

<many-to-many class="com.oreilly.hh.data.Track" column="TRACK_ID"/>

</set>

Page 33: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

33 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Mapping Collections (Artist.hbm.xml)

<?xml version="1.0“ encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC ...>

<hibernate-mapping>

<class name="com.oreilly.hh.data.Artist" table="ARTIST">

<meta attribute="class-description"> ... </meta>

<id name="id" type="int" column="ARTIST_ID">

<generator class="native"/>

</id>

<property name="name" type="string">

<column name="NAME" not-null="true" unique="true" index="ARTIST_NAME"/>

</property>

<set name="tracks" table="TRACK_ARTISTS" inverse="true">

<key column="ARTIST_ID"/>

<many-to-many class="com.oreilly.hh.data.Track" column="TRACK_ID"/>

</set>

</class>

</hibernate-mapping>

Page 34: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

34 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Mapping Collections (Track.hbm.xml)

<?xml version="1.0“ encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC ...>

<hibernate-mapping>

<class name="com.oreilly.hh.data.Track" table="TRACK">

...

<set name="artists" table="TRACK_ARTISTS">

<key column="TRACK_ID"/>

<many-to-many class="com.oreilly.hh.data.Artist" column="ARTIST_ID"/>

</set>

...

</class>

</hibernate-mapping>

Page 35: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

35 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Mapping Collections (hibernate.cfg.xml)

hibernate.cfg.xml :

<?xml version="1.0“ encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC ...>

<hibernate-configuration>

<session-factory>

...

<mapping resource="com/oreilly/hh/data/Track.hbm.xml"/>

<mapping resource="com/oreilly/hh/data/Artist.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Page 36: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

36 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Persisting Collections (CreateTest.java)

public class CreateTest {

public static Artist getArtist(String name, boolean create, Session session)

{

Query query = session.getNamedQuery("com.oreilly.hh.artistByName");

query.setString("name", name);

Artist found = (Artist)query.uniqueResult();

if (found == null && create) {

found = new Artist(name, new HashSet<Track>());

session.save(found);

}

return found;

}

/**

* Utility method to associate an artist with a track

*/

private static void addTrackArtist(Track track, Artist artist) {

track.getArtists().add(artist);

}

...

Page 37: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

37 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Persisting Collections (Artist.hbm.xml)

Artist.hbm.xml :

...

<query name="com.oreilly.hh.artistByName">

<![CDATA[

from Artist as artist

where upper(artist.name) = upper(:name)

]]>

</query>

...

Track.hbm.xml :

...

<query name="com.oreilly.hh.tracksNoLongerThan">

<![CDATA[

from Track as track

where track.playTime <= :length

]]>

</query>

...

Page 38: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

38 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Persisting Collections (CreateTest.java) …...

public static void main(String args[]) throws Exception {

...

try {

// Create some data and persist it

tx = session.beginTransaction();

Track track = new Track("Russian Trance", "vol2/album610/track02.mp3",

Time.valueOf("00:03:30"), new HashSet<Artist>(), new Date(), (short)0);

addTrackArtist(track, getArtist("PPK", true, session));

session.save(track);

track = new Track("Video Killed the Radio Star", "vol2/album611/track12.mp3",

Time.valueOf("00:03:49"), new HashSet<Artist>(), new Date(), (short)0);

addTrackArtist(track, getArtist("The Buggles", true, session));

session.save(track);

track = new Track("Gravity's Angel", "vol2/album175/track03.mp3",

Time.valueOf("00:06:06"), new HashSet<Artist>(), new Date(), (short)0);

addTrackArtist(track, getArtist("Laurie Anderson", true, session));

session.save(track);

Page 39: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

39 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Persisting Collections (CreateTest.java)...

track = new Track("Adagio for Strings (Ferry Corsten Remix)", "vol2/album972/track01.mp3",

Time.valueOf("00:06:35"), new HashSet<Artist>(), new Date(), (short)0);

addTrackArtist(track, getArtist("William Orbit", true, session));

addTrackArtist(track, getArtist("Ferry Corsten", true, session));

addTrackArtist(track, getArtist("Samuel Barber", true, session));

session.save(track);

track = new Track("Adagio for Strings (ATB Remix)", "vol2/album972/track02.mp3",

Time.valueOf("00:07:39"), new HashSet<Artist>(), new Date(), (short)0);

addTrackArtist(track, getArtist("William Orbit", true, session));

addTrackArtist(track, getArtist("ATB", true, session));

addTrackArtist(track, getArtist("Samuel Barber", true, session));

session.save(track);

track = new Track("The World '99", "vol2/singles/pvw99.mp3",

Time.valueOf("00:07:05"), new HashSet<Artist>(), new Date(), (short)0);

addTrackArtist(track, getArtist("Pulp Victim", true, session));

addTrackArtist(track, getArtist("Ferry Corsten", true, session));

session.save(track);

track = new Track("Test Tone 1", "vol2/singles/test01.mp3",

Time.valueOf("00:00:10"), new HashSet<Artist>(), new Date(), (short)0);

session.save(track);...

Page 40: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

40 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Persisting Collections : What just happened?

$ gradle ctest

$ gradle db

Page 41: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

41 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Retrieving Collections (QueryTest.java) …

package com.oreilly.hh;

...

public class QueryTest {

...

public static String listArtistNames(Set<Artist> artists) {

StringBuilder result = new StringBuilder();

for (Artist artist : artists) {

result.append((result.length() == 0) ? "(" : ", ");

result.append(artist.getName());

}

if (result.length() > 0) {

result.append(") ");

}

return result.toString();

}

...

Page 42: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

42 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Retrieving Collections (QueryTest.java)

public class QueryTest {

...

public static String listArtistNames(Set<Artist> artists) { ... }

public static void main(String args[]) throws Exception {

...

try {

// Print the tracks that will fit in seven minutes

List tracks = tracksNoLongerThan(Time.valueOf("00:07:00"),

session);

for ( Track aTrack : tracks ) {

System.out.println("Track: \"" + aTrack.getTitle() + "\" " +

listArtistNames(aTrack.getArtists()) +

aTrack.getPlayTime());

}

}

...

}

}

Page 43: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

43 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Retrieving Collections (Hibernate.cfg.xml)

...

<!-- Echo all executed SQL to stdout -->

<property name="show_sql">false</property>

...

Page 44: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

44 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Retrieving Collections : QueryTest Output

$ gradle qtest

:ch04:compileJava UP-TO-DATE

:ch04:processResources UP-TO-DATE

:ch04:classes UP-TO-DATE

:ch04:qtest

Track: "Russian Trance" (PPK) 00:03:30

Track: "Video Killed the Radio Star" (The Buggles) 00:03:49

Track: "Gravity's Angel" (Laurie Anderson) 00:06:06

Track: "Adagio for Strings (Ferry Corsten Remix)" (Ferry Corsten, William Orbit, Samuel Ba

rber) 00:06:35

Track: "Test Tone 1" 00:00:10

Comment: Pink noise to test equalization

BUILD SUCCESSFUL

Total time: 2.299 secs

Page 45: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

45 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Using Bidirectional Associations (QueryTest2.java)// Example 4-12. Source for QueryTest2.java

public class QueryTest2 extends JPanel {

...

private void updateTracks(String name) {

model.removeAllElements(); // Clear out previous tracks

if (name.length() < 1) return; // Nothing to do

try {

// Ask for a session using the JDBC information we've configured

Session session = sessionFactory.openSession();

try {

Artist artist = CreateTest.getArtist(name, false, session);

if (artist == null) { // Unknown artist

model.addElement("Artist not found");

return;

}

// List the tracks associated with the artist

for (Track aTrack : artist.getTracks()) {

model.addElement("Track: \"" + aTrack.getTitle() + "\", " + aTrack.getPlayTime());

}

} finally {

session.close();

}

} catch (Exception e) {

System.err.println("Problem updating tracks:" + e);

e.printStackTrace();

}

}

Page 46: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

46 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Using Bidirectional Associations (build.gradle)

...

task qtest2(dependsOn: classes, type: JavaExec) {

main = 'com.oreilly.hh.QueryTest2'classpath = sourceSets.main.runtimeClasspath

}

$ gradle qtest2

Page 47: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

47 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Working with Simpler Collections …

Page 48: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

48 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Working with Simpler Collections …

Collections of associations to other objects

collections of simple values, like strings, numbers, and nonpersistentvalue classes– want to record some number of comments about each track in the database– Track.hbm.xml

– gradle schema

...

<set name="comments" table="TRACK_COMMENTS">

<key column="TRACK_ID"/>

<element column="COMMENT" type="string"/>

</set>

create table TRACK_COMMENTS (TRACK_ID integer not null, COMMENT varchar(255));

alter table TRACK_COMMENTS

add constraint FK105B26882DCBFAB5 foreign key (TRACK_ID) references TRACK;

Page 49: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

49 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Working with Simpler Collections …

Add Comment Set at the end of each Constructor of CreateTest.java :

Then assign a comment on the following line :

track = new Track("Test Tone 1", "vol2/singles/test01.mp3",

Time.valueOf("00:00:10"), new HashSet<Artist>(),

new Date(), (short)0, new HashSet<String>());

track.getComments().add("Pink noise to test equalization");

Page 50: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

50 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Working with Simpler Collections …

Add another loop after the track println( ) in QueryTest.java to print the comments for the track :

gradle qtest

for (String comment : aTrack.getComments()) {

System.out.println(" Comment: " + comment);

}

...

Track: "Test Tone 1" 00:00:10

Comment: Pink noise to test equalization

Page 51: Chapter 4. Collections and Associationscontents.kocw.net/KOCW/document/2016/hanbat/kimyoungchan/4.pdf · Prof. Youngchan KIM, Dept of Computer Engineering, 1 / 51 Hanbat National

51 / 51Prof. Youngchan KIM, Dept of Computer Engineering, Hanbat National University

Database Programming

Materials for Further Study

Hibernate Home– http://www.hibernate.org/

Hibernate Manual– Hibernate Getting Started Guide 3.6

• http://docs.jboss.org/hibernate/core/3.6/quickstart/en-US/html/

– Hibernate Reference Documentation 3.6• http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/• http://docs.jboss.org/hibernate/core/3.6/reference/en-US/pdf/hibernate_reference.pdf

– Hibernate Reference Documentation 4.3 and 5.0

Hibernate Tutorial– http://www.mkyong.com/tutorials/hibernate-tutorials/