SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Professional Open Source™




           Association Mappings of Entities




© JBoss, Inc. 2003, 2004.                                  07/17/04   1
Entity Associations
                                                         Professional Open Source™


  A bidirectional one-to-many entity association:




  Managed associations:
    – a change to one side is immediately reflect on the other side
    – e.g. bid.setItem(item)executes
      item.getBids().add(bid)
    – used with container-managed relationships (CMR) in EJB/CMP

  POJOs do not have automatically managed associations!
    – the common Java semantics apply
    – we have to manually set both "ends" of the "link"
    – Hibernate doesn't interfere with POJO semantics!


© JBoss, Inc. 2003, 2004.                                                            2
The tables of this association Mapping
                                                                       Professional Open Source™




                            << table >>                   << table >>
                               ITEM                           BID
                            ITEM_ID <<PK>>                BID_ID <<PK>>
                            NAME                          ITEM_ID <<FK>>
                            PRICE                         AMOUNT
                            ...                           ...



             ITEM
            ITEM_ID              NAME   PRICE   BID
                                                BID_ID       ITEM_ID       AMOUNT
                     1           Foo     2.00
                     2           Bar    50.00         1         1          10.00
                     3           Baz     1.00         2         1          20.00
                                                      3         2          55.00




© JBoss, Inc. 2003, 2004.                                                                          3
Mapping a Unidirectional association
                                                                             Professional Open Source™



                            class Bid {
                                 private Item item;
                                 public void setItem(Item i) { this.item =
                            i; }
                                 public Item getItem() { return item; }
                            }

                            <class name="Bid" table="BID">
                                ...
                                <many-to-one
                                     name="item"
                                     class="Item"
                                     column="ITEM_ID"
                                     not-null="true"/>
                            </class>


           The column ITEM_ID is a FK to the PK of the ITEM table.




© JBoss, Inc. 2003, 2004.                                                                                4
Making the association Bi Directional
                                                                             Professional Open Source™



                            class Item {
                                private Set bids = new HashSet();
                                public void getBids() { return bids; }
                                public void addBid(Bid b) {
                                    this.bids.add(b)
                                    b.setItem(this) // Manage association!
                                }
                            }

                            <class name="Item" table="ITEM">
                                  <set name="bids">
                                     <key column="ITEM_ID"/>
                                     <one-to-many class="Bid"/>
                                </set>
                            </class>

         The key element refers to the ITEM_ID column in the BID
         table. Hibernate also knows that the table used for the
         collection is the same table the target entity class is mapped
         to—the <set> mapping needs no table attribute like
         collection of value types
© JBoss, Inc. 2003, 2004.                                                                                5
The big problem
                                                                       Professional Open Source™


  We have referenced the ITEM_ID in two mappings
           At runtime, we have two in-memory representations of this associtaion, the
              item property of the Bid and the bids of the Item. Suppose we modify
              this association:



                               item.getBids().add(newBid);
                               newBid.setItem(item);




        Hibernate does not transparently detect the fact that the two changes
        refer to the same database column, since at this point we have done
               nothing to indicate that this is a bidirectional association.




© JBoss, Inc. 2003, 2004.                                                                          6
Making the association bidirectional
                                                                   Professional Open Source™


  We have to declare one end as inverse:


                            <class name="Item" table="ITEM">
                                ...

                                <set name="bids" inverse="true">
                                    <key column="ITEM_ID"/>
                                    <one-to-many class="Bid"/>
                                </set>

                            </class>



           – changes to the inverse end will be ignored!
           – without inverse=“true”, Hibernate would try to issue two UPDATE
             statements




© JBoss, Inc. 2003, 2004.                                                                      7
Can you switch the inverse side to <many-to-one>?
                                                             Professional Open Source™


  The <many-to-one> element doesn’t have an inverse attribute,
  but you can map it with update="false" and insert="false“ to
   effectively ignore it for any UPDATE or INSERT statements. The
   collection side is then non inverse and considered for insertion or
   updating of the foreign key column.




© JBoss, Inc. 2003, 2004.                                                                8
Cascading object state
                                                                                    Professional Open Source™


  The following code creates a new Item (which we consider the parent)
   and a new Bid instance (the child):
                     Item newItem = new Item();
                     Bid newBid = new Bid();
                     newItem.addBid(newBid); // Set both sides of the association
                     session.save(newItem);
                     session.save(newBid);


  The second call to session.save() seems redundant, if we’re talking
   about a true parent/children relationship.

  How to remove this redundancy??
  - solution is to enable transitive persistence




© JBoss, Inc. 2003, 2004.                                                                                       9
Transitive persistence
                                                               Professional Open Source™


  When you instantiate a new Bid and add it to an Item, the bid should
   become persistent automatically. You’d like to avoid making the Bid
   persistent explicitly with an extra save() operation.
  To enable this transitive state across the association, add a cascade
   option to the XML mapping:
  <class name="Item“ table="ITEM">
  ...
      <set name="bids“ inverse="true“ cascade="save-update">
           <key column="ITEM_ID"/>
           <one-to-many class="Bid"/>
       </set>
  </class>
  The cascade="save-update" attribute enables transitive persistence
   for Bid instances, if a particular Bid is referenced by a persistent Item,
   in the collection.

© JBoss, Inc. 2003, 2004.                                                                  10
Cascading for delete operation
                                        Professional Open Source™


  <set name="bids“ inverse="true“
  cascade="save-update, delete">




© JBoss, Inc. 2003, 2004.                                           11
Considering Bag for one-to-many associations
                                                               Professional Open Source™


  Bags have the most efficient performance characteristics of all the
   collections you can use for a bidirectional one-to-many entity
   association (in other words, if the collection side is inverse="true"). By
   default, collections in Hibernate are loaded only when they’re
   accessed for the first time in the application. Because a bag doesn’t
   have to maintain the index of its elements (like a list) or check for
  duplicate elements (like a set), you can add new elements to the bag
   without triggering the loading. This is an important feature if you’re
   going to map a possibly large collection of entity references.

  On the other hand, you can’t eager-fetch two collections of bag type
   simultaneously (for example, if bids and images of an Item were one-
   to-many bags).




© JBoss, Inc. 2003, 2004.                                                                  12
Mapping Bag for one-to-many associations
                                                                        Professional Open Source™




         You rename the <set> element to <bag>, making no other changes.

         A bag also allows duplicate elements, which the set you mapped earlier
         didn’t. It turns out that this isn’t relevant in this case, because duplicate
         means you’ve added a particular reference to the same Bid instance several
         times. You wouldn’t do this in your application code.

         But even if you add the same reference several times to this collection,
         Hibernate ignores it—it’s mapped inverse.



© JBoss, Inc. 2003, 2004.                                                                           13
Unidirectional lists for one-to-many
                                                            Professional Open Source™


  If you need a real list to hold the position of the elements in a
   collection, you have to store that position in an additional column.
  The additional column that holds the position of a reference to a Bid
   instance is the BID_POSITION, in the mapping of Item:




         Bid table will look like below :




© JBoss, Inc. 2003, 2004.                                                               14
Unidirectional List for one-to-many
                                                         Professional Open Source™


  This mapping isn’t really complete.
  Consider the ITEM_ID foreign key column : It’s NOT NULL (a bid has
   to reference an item). The first problem is that you don’t
  specify this constraint in the mapping.
  Also, because this mapping is unidirectional (the collection is non
   inverse), you have to assume that there is no opposite side mapped
   to the same foreign key column (where this constraint could be
   declared). You need to add a not-null="true" attribute to the <key>
  element of the collection mapping:




© JBoss, Inc. 2003, 2004.                                                            15
Bidirectional List for one-to-many – The problem
                                                             Professional Open Source™


  U might want to add a <many-to-one> on the ITEM_ID foreign key
   column to make this association bidirectional, and enable
  inverse="true" on the collection as follows :
      <many-to-one name="item“ class="Item"
            column="ITEM_ID“ not-null="true"/>
      <list name="bids" inverse="true">
            <key column="ITEM_ID"/>
             <list-index column=“BID_POSITION”/>
            <one-to-many class="Bid"/>
      </list>
  Remember that Hibernate ignores the state of an inverse collection!
   This time, however, the collection contains information that is needed
   to update the database correctly: the position of its elements. If only
   the state of each Bid instance is considered for synchronization, and
   the collection is inverse and ignored, Hibernate has no value for the
   BID_POSITION column.
© JBoss, Inc. 2003, 2004.                                                                16
Bidirectional List for one-to-many – The Solution
                                                                  Professional Open Source™


  If you map a bidirectional one-to-many entity association with an
   indexed collection , you have to switch the inverse sides.
  You can’t make an indexed collection inverse="true". The collection
   becomes responsible for state synchronization, and the one side, the
   Bid, has to be made inverse.
  However, there is no inverse="true" for a many-to-one mapping so
   you need to simulate this attribute on a <many-to-one>:
                                     Setting insert and update to false has the
                                     desired effect. These two attributes used
                                     together make a property effectively read-
                                     only. This side
                                     of the association is therefore ignored for
                                     any write operations, and the state of
                                     the collection (including the index of the
                                     elements) is the relevant state when the
                                     in-memory state is synchronized with the
                                     database.
© JBoss, Inc. 2003, 2004.                                                                     17
Optional one-to-many association – The problem
                                                           Professional Open Source™


  A useful addition to the Item class is a buyer property. You can then
   call anItem.getBuyer() to access the User who made the winning bid.

  From the point of view of the User class, the association is one-to-
   many. One user can buy many items and one item can be bought
   only by one user. But one user may not but any items and an item
   may not have been bought. So this is optional one-to-many
   association .

  You expect a BUYER_ID foreign key column in the ITEM table. The
   column has to be nullable—a particular Item may not have been
   bought.
  You can accept that the foreign key column can be NULL and
   apply additional constraints . But this is not a good design



© JBoss, Inc. 2003, 2004.                                                              18
Optional one-to-many association – The solution with join table
                                                              Professional Open Source™


  An optional entity association, be it one-to-one or one-to-many, is
   best represented in an SQL database with a join table.

  In the current case, you have a one-to-many multiplicity, so only the
   ITEM_ID column of the ITEM_BUYER table is unique. A particular
  item can be bought only once. But one user can buy many items




© JBoss, Inc. 2003, 2004.                                                                 19
Optional one-to-many association – mapping
                                                                   Professional Open Source™




    You use a Set as the collection type. The collection table is the join table,
    ITEM_BUYER; its primary key is a composite of USER_ID and ITEM_ID.
    <many-to-many> required because the regular <one-to-many> doesn’t
    know anything about join tables. By forcing a unique constraint on the
    foreign key column that references the target entity table, you effectively
    force a one-to-many multiplicity.




© JBoss, Inc. 2003, 2004.                                                                      20
Optional one-to-many association – making bidirectional
                                                               Professional Open Source™


  You can map this association bidirectional with the buyer property of
   Item. Without the join table, you’d add a <many-to-one> with a
   USER_ID foreign key column in the ITEM table. With the join table,
   you have to move this foreign key column into the join table. This is
   possible with a <join> mapping:




         Two important details:
         First, the association is optional, and you tell Hibernate not to
         insert a row into the join table if the grouped properties (only
         one here, buyer) are null.



© JBoss, Inc. 2003, 2004.                                                                  21
Professional Open Source™


  Second, this is a bidirectional entity association. As always, one of the
  side has to be the inverse end. You’ve chosen the <join> to be
   inverse; Hibernate now uses the collection state to synchronize the
   database and ignores the state of the Item.buyer property.

  As long as your collection is not an indexed variation (a
  list, map, or array), you can reverse this by declaring the
   collection inverse="true".




© JBoss, Inc. 2003, 2004.                                                                 22
One to one entity association
                                                             Professional Open Source™


  The relationship between User and Address are best represented
   with a <component> mapping .
  If Address in made as an entity instead of a value type, the benefit is
   the possibility of shared references. In such a case , User and
   Address classes have a true one-to-one association.




© JBoss, Inc. 2003, 2004.                                                                23
Shared primary key associations (one to one)
                                                         Professional Open Source™


  Rows in two tables related by a primary key association share the
   same primary key values.
  The main difficulty with this approach is ensuring that associated
   instances are assigned the same primary key value when the objects
   are saved.

  First you need a new property in the User class:




         Next, map the association in User.hbm.xml:



© JBoss, Inc. 2003, 2004.                                                            24
Shared primary key associations (one to one)
                                                             Professional Open Source™


  You add a cascading option that is natural for this model: If a User
   instance is made persistent, you usually also want its
   shippingAddress to become persistent.
  Hence, the following code is all that is needed to save both objects:




         Hibernate inserts a row into the USERS table and a row into
         the ADDRESS table. But wait, this doesn’t work!

          How can Hibernate possibly know that the record in the
         ADDRESS table needs to get the same primary key value as
         the USERS row?
         You need to enable a special identifier generator.

© JBoss, Inc. 2003, 2004.                                                                25
The foreign identifier generator
                                                                  Professional Open Source™


  If an Address instance is saved, it needs to get the primary key value
   of a User object.
  The special foreign identifier generator for Address has to know
   where to get the right primary key value.

  The first step to create this identifier binding between Address and
   User is a bidirectional association. Add a new user property to the
   Address entity:




         Map the new user property of an Address in Address.hbm.xml:




© JBoss, Inc. 2003, 2004.                                                                     26
The foreign identifier generator .. contd
                                                           Professional Open Source™


  This mapping not only makes the association bidirectional, but also,
   with constrained=“true", adds a foreign key constraint linking the
   primary key of the ADDRESS table to the primary key of the USERS
   table. In other words, the database guarantees that an ADDRESS
   row’s primary key references a valid USERS primary key.

  You can now use the special foreign identifier generator for Address
   objects:




© JBoss, Inc. 2003, 2004.                                                              27
The foreign identifier generator .. contd
                                                            Professional Open Source™


  Read it as follows: When an Address is saved, the primary key value
   is taken from the user property. The user property is a reference
  to a User object;
  Hence, the primary key value that is inserted is the same
  as the primary key value of that instance. Look at the table structure
   in figure below :




© JBoss, Inc. 2003, 2004.                                                               28
One-to-one foreign key associations
                                                          Professional Open Source™


  Instead of sharing a primary key, two rows can have a foreign key
   relationship.
  One table has a foreign key column that references the primary key of
   the associated table. (The source and target of this foreign key
   constraint can even be the same table: This is called a self-
   referencing relationship)
  Let’s change the mapping from a User to an Address. Instead of the
   shared primary key, you now add a SHIPPING_ADDRESS_ID
   column in the USERS table:




© JBoss, Inc. 2003, 2004.                                                             29
One-to-one foreign key associations
                                                             Professional Open Source™


  The mapping element in XML for this association is <many-to-one>—
   not <one-to-one>, as you might have expected. The reason is simple:
   You don’t care what’s on the target side of the association, so you
   can treat it like a to-one association without the many part. All you
   want is to express “This entity has a property that is a reference to an
   instance of another entity” and use a foreign key field to represent
  that relationship. The database schema for this mapping is shown as
   below :




© JBoss, Inc. 2003, 2004.                                                                30
One-to-one foreign key associations
                                                                        Professional Open Source™


  An additional constraint enforces this relationship as a real one to
   one. By making the SHIPPING_ADDRESS_ID column unique, you
   declare that a particular address can be referenced by at most one
   user, as a shipping address

  Let’s make the association from User to Address bidirectional.
  The last foreign key association was mapped from User to Address
   with <many-to-one> and a unique constraint to guarantee the desired
   multiplicity.
  What mapping element can you add on the Address side to make
   this association bidirectional, so that access from Address to User is
   possible in the Java domain model? See below …



         You tell Hibernate that the user property of the Address class is the inverse
         of a property on the other side of the association.
© JBoss, Inc. 2003, 2004.                                                                           31
Mapping with a join table – optional one-to-one
                                                             Professional Open Source™

  Let us think of optional one-to-one association between Person and
   Desk . i.e, A person may be allocated a desk or not and a desk may
   be allocated to a person or not .But a person should be allocated
   atmost one desk and a desk must be allocated to atmost one Person

  To make one-to-one optional , we can use foreign key strategy .Let us
   assume that Person is having the foreign key. We can map this one-
   to-one relation as follows :

  <many-to-one name=“desk" class=“Desk" cascade="save-update"
  column=“DESK_ID" unique="true" />

  As not-null=“false” by default for this many-to-one , the association
   from person to desk is optional .
  What about the association from Desk to Person ?
           – Solution is We need a join table


© JBoss, Inc. 2003, 2004.                                                                32
Using Join table
                                                            Professional Open Source™


  Let us assume that ASSIGNMENT is the name of join table.
  This table has only two columns: PERSON_ID and DESK_ID. The
   multiplicity of these foreign key columns is enforced with a unique
   constraint on both—a particular person and desk can only be
   assigned once, and only one such an assignment can exist.
  As another example consider optional one-to-one association
   between Item and Shipment . It can be represented as follows with
   the join table .




© JBoss, Inc. 2003, 2004.                                                               33
Mapping for join table
                                                                                  Professional Open Source™




         The join table has two foreign key columns: SHIPMENT_ID, referencing the
         primary key of the SHIPMENT table; and ITEM_ID, referencing the ITEM table.
         The ITEM_ID column is unique; a particular item can be assigned to exactly one
         shipment. Because the primary key of the join table is SHIPMENT_ID, which
         makes this column also unique, you have a guaranteed one-to-one multiplicity
         between Shipment and Item. By setting optional="true" on the <join> mapping,
         you tell Hibernate that it should insert a row into the join table only if the properties
         grouped by this mapping are non-null. But if a row needs to be inserted , the NOT
         NULL constraint on the ITEM_ID column applies.

© JBoss, Inc. 2003, 2004.                                                                                     34
unidirectional many-to-many association
                                                             Professional Open Source™




                                             The join table has two columns:
                                             the foreign keys of the
                                             CATEGORY and ITEM tables.
                                             The primary key is a composite
                                             of both columns.




© JBoss, Inc. 2003, 2004.                                                                35
unidirectional many-to-many association with <idbag>
                                                                    Professional Open Source™


         With an <idbag> mapping, the primary key is a surrogate key column,
         CATEGORY_ITEM_ID. Duplicate links are therefore allowed;




© JBoss, Inc. 2003, 2004.                                                                       36
A bidirectional many-to-many association
                                                        Professional Open Source™


  One side in a bidirectional association has to be mapped as
   inverse because you have named the foreign key column(s) twice.




         You have enabled
         cascade="save-update" for
         both ends of the collection.
          On the other hand, the
         cascading options all, delete,
         and delete-orphans aren’t
         meaningful for many-to-
         many associations.




© JBoss, Inc. 2003, 2004.                                                           37

Weitere ähnliche Inhalte

Was ist angesagt?

아이폰강의(4) pdf
아이폰강의(4) pdf아이폰강의(4) pdf
아이폰강의(4) pdf
sunwooindia
 
Why SOLID matters - even for JavaScript
Why SOLID matters - even for JavaScriptWhy SOLID matters - even for JavaScript
Why SOLID matters - even for JavaScript
martinlippert
 
EAV in Magento
EAV in MagentoEAV in Magento
EAV in Magento
hazzaz
 
TrainCarMultiviews
TrainCarMultiviewsTrainCarMultiviews
TrainCarMultiviews
P1666
 
Introduction to XAML and its features
Introduction to XAML and its featuresIntroduction to XAML and its features
Introduction to XAML and its features
Abhishek Sur
 
Session 5 Tp5
Session 5 Tp5Session 5 Tp5
Session 5 Tp5
phanleson
 

Was ist angesagt? (20)

introduction of Java beans
introduction of Java beansintroduction of Java beans
introduction of Java beans
 
Dig Deeper into WordPress - WD Meetup Cairo
Dig Deeper into WordPress - WD Meetup CairoDig Deeper into WordPress - WD Meetup Cairo
Dig Deeper into WordPress - WD Meetup Cairo
 
아이폰강의(4) pdf
아이폰강의(4) pdf아이폰강의(4) pdf
아이폰강의(4) pdf
 
Bean Intro
Bean IntroBean Intro
Bean Intro
 
Тестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumТестирование Magento с использованием Selenium
Тестирование Magento с использованием Selenium
 
S313431 JPA 2.0 Overview
S313431 JPA 2.0 OverviewS313431 JPA 2.0 Overview
S313431 JPA 2.0 Overview
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
 
REST API
REST APIREST API
REST API
 
javabeans
javabeansjavabeans
javabeans
 
WordCamp Denver 2012 - Custom Meta Boxes
WordCamp Denver 2012 - Custom Meta BoxesWordCamp Denver 2012 - Custom Meta Boxes
WordCamp Denver 2012 - Custom Meta Boxes
 
领域驱动设计实例讲解
领域驱动设计实例讲解领域驱动设计实例讲解
领域驱动设计实例讲解
 
Why SOLID matters - even for JavaScript
Why SOLID matters - even for JavaScriptWhy SOLID matters - even for JavaScript
Why SOLID matters - even for JavaScript
 
The Magic of WPF & MVVM
The Magic of WPF & MVVMThe Magic of WPF & MVVM
The Magic of WPF & MVVM
 
Mvc & java script
Mvc & java scriptMvc & java script
Mvc & java script
 
EAV in Magento
EAV in MagentoEAV in Magento
EAV in Magento
 
Unit iv
Unit ivUnit iv
Unit iv
 
TrainCarMultiviews
TrainCarMultiviewsTrainCarMultiviews
TrainCarMultiviews
 
Javabeans
JavabeansJavabeans
Javabeans
 
Introduction to XAML and its features
Introduction to XAML and its featuresIntroduction to XAML and its features
Introduction to XAML and its features
 
Session 5 Tp5
Session 5 Tp5Session 5 Tp5
Session 5 Tp5
 

Ähnlich wie 07 association of entities

Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6
Ray Ploski
 
12 global fetching strategies
12 global fetching strategies12 global fetching strategies
12 global fetching strategies
thirumuru2012
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injection
srmelody
 
Pyconie 2012
Pyconie 2012Pyconie 2012
Pyconie 2012
Yaqi Zhao
 
Session 6 Tp6
Session 6 Tp6Session 6 Tp6
Session 6 Tp6
phanleson
 

Ähnlich wie 07 association of entities (20)

Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6
 
15 jpa
15 jpa15 jpa
15 jpa
 
Mpg Dec07 Gian Lorenzetto
Mpg Dec07 Gian Lorenzetto Mpg Dec07 Gian Lorenzetto
Mpg Dec07 Gian Lorenzetto
 
Ejb examples
Ejb examplesEjb examples
Ejb examples
 
Metaworks3
Metaworks3Metaworks3
Metaworks3
 
L0043 - Interfacing to Eclipse Standard Views
L0043 - Interfacing to Eclipse Standard ViewsL0043 - Interfacing to Eclipse Standard Views
L0043 - Interfacing to Eclipse Standard Views
 
2 introduction toentitybeans
2 introduction toentitybeans2 introduction toentitybeans
2 introduction toentitybeans
 
14 hql
14 hql14 hql
14 hql
 
Dacj 4 2-c
Dacj 4 2-cDacj 4 2-c
Dacj 4 2-c
 
NodeJS Spring style Inversifyjs
NodeJS Spring style InversifyjsNodeJS Spring style Inversifyjs
NodeJS Spring style Inversifyjs
 
12 global fetching strategies
12 global fetching strategies12 global fetching strategies
12 global fetching strategies
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injection
 
Rapid Prototyping with PEAR
Rapid Prototyping with PEARRapid Prototyping with PEAR
Rapid Prototyping with PEAR
 
Phactory
PhactoryPhactory
Phactory
 
Pyconie 2012
Pyconie 2012Pyconie 2012
Pyconie 2012
 
Introduction to Spring Boot.pdf
Introduction to Spring Boot.pdfIntroduction to Spring Boot.pdf
Introduction to Spring Boot.pdf
 
Android development for iOS developers
Android development for iOS developersAndroid development for iOS developers
Android development for iOS developers
 
Introduction to backbone presentation
Introduction to backbone presentationIntroduction to backbone presentation
Introduction to backbone presentation
 
Real World MVC
Real World MVCReal World MVC
Real World MVC
 
Session 6 Tp6
Session 6 Tp6Session 6 Tp6
Session 6 Tp6
 

Mehr von thirumuru2012

12 hibernate int&cache
12  hibernate int&cache12  hibernate int&cache
12 hibernate int&cache
thirumuru2012
 
11 transitive persistence and filters
11 transitive persistence and filters11 transitive persistence and filters
11 transitive persistence and filters
thirumuru2012
 
10 conversations new
10 conversations new10 conversations new
10 conversations new
thirumuru2012
 
09 transactions new1
09 transactions new109 transactions new1
09 transactions new1
thirumuru2012
 
02 hibernateintroduction
02 hibernateintroduction02 hibernateintroduction
02 hibernateintroduction
thirumuru2012
 
01 persistence and domain modeling
01 persistence and domain modeling01 persistence and domain modeling
01 persistence and domain modeling
thirumuru2012
 

Mehr von thirumuru2012 (13)

15 jpa introduction
15 jpa introduction15 jpa introduction
15 jpa introduction
 
14 criteria api
14 criteria api14 criteria api
14 criteria api
 
13 caching latest
13 caching   latest13 caching   latest
13 caching latest
 
12 hibernate int&cache
12  hibernate int&cache12  hibernate int&cache
12 hibernate int&cache
 
11 transitive persistence and filters
11 transitive persistence and filters11 transitive persistence and filters
11 transitive persistence and filters
 
10 conversations new
10 conversations new10 conversations new
10 conversations new
 
09 transactions new1
09 transactions new109 transactions new1
09 transactions new1
 
09 transactions new
09 transactions new09 transactions new
09 transactions new
 
05 inheritance
05 inheritance05 inheritance
05 inheritance
 
04 dataaccess
04 dataaccess04 dataaccess
04 dataaccess
 
02 hibernateintroduction
02 hibernateintroduction02 hibernateintroduction
02 hibernateintroduction
 
01 persistence and domain modeling
01 persistence and domain modeling01 persistence and domain modeling
01 persistence and domain modeling
 
15 jpaql
15 jpaql15 jpaql
15 jpaql
 

Kürzlich hochgeladen

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Kürzlich hochgeladen (20)

Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 

07 association of entities

  • 1. Professional Open Source™ Association Mappings of Entities © JBoss, Inc. 2003, 2004. 07/17/04 1
  • 2. Entity Associations Professional Open Source™  A bidirectional one-to-many entity association:  Managed associations: – a change to one side is immediately reflect on the other side – e.g. bid.setItem(item)executes item.getBids().add(bid) – used with container-managed relationships (CMR) in EJB/CMP  POJOs do not have automatically managed associations! – the common Java semantics apply – we have to manually set both "ends" of the "link" – Hibernate doesn't interfere with POJO semantics! © JBoss, Inc. 2003, 2004. 2
  • 3. The tables of this association Mapping Professional Open Source™ << table >> << table >> ITEM BID ITEM_ID <<PK>> BID_ID <<PK>> NAME ITEM_ID <<FK>> PRICE AMOUNT ... ... ITEM ITEM_ID NAME PRICE BID BID_ID ITEM_ID AMOUNT 1 Foo 2.00 2 Bar 50.00 1 1 10.00 3 Baz 1.00 2 1 20.00 3 2 55.00 © JBoss, Inc. 2003, 2004. 3
  • 4. Mapping a Unidirectional association Professional Open Source™ class Bid { private Item item; public void setItem(Item i) { this.item = i; } public Item getItem() { return item; } } <class name="Bid" table="BID"> ... <many-to-one name="item" class="Item" column="ITEM_ID" not-null="true"/> </class> The column ITEM_ID is a FK to the PK of the ITEM table. © JBoss, Inc. 2003, 2004. 4
  • 5. Making the association Bi Directional Professional Open Source™ class Item { private Set bids = new HashSet(); public void getBids() { return bids; } public void addBid(Bid b) { this.bids.add(b) b.setItem(this) // Manage association! } } <class name="Item" table="ITEM"> <set name="bids"> <key column="ITEM_ID"/> <one-to-many class="Bid"/> </set> </class> The key element refers to the ITEM_ID column in the BID table. Hibernate also knows that the table used for the collection is the same table the target entity class is mapped to—the <set> mapping needs no table attribute like collection of value types © JBoss, Inc. 2003, 2004. 5
  • 6. The big problem Professional Open Source™  We have referenced the ITEM_ID in two mappings At runtime, we have two in-memory representations of this associtaion, the item property of the Bid and the bids of the Item. Suppose we modify this association: item.getBids().add(newBid); newBid.setItem(item); Hibernate does not transparently detect the fact that the two changes refer to the same database column, since at this point we have done nothing to indicate that this is a bidirectional association. © JBoss, Inc. 2003, 2004. 6
  • 7. Making the association bidirectional Professional Open Source™  We have to declare one end as inverse: <class name="Item" table="ITEM"> ... <set name="bids" inverse="true"> <key column="ITEM_ID"/> <one-to-many class="Bid"/> </set> </class> – changes to the inverse end will be ignored! – without inverse=“true”, Hibernate would try to issue two UPDATE statements © JBoss, Inc. 2003, 2004. 7
  • 8. Can you switch the inverse side to <many-to-one>? Professional Open Source™  The <many-to-one> element doesn’t have an inverse attribute,  but you can map it with update="false" and insert="false“ to effectively ignore it for any UPDATE or INSERT statements. The collection side is then non inverse and considered for insertion or updating of the foreign key column. © JBoss, Inc. 2003, 2004. 8
  • 9. Cascading object state Professional Open Source™  The following code creates a new Item (which we consider the parent) and a new Bid instance (the child): Item newItem = new Item(); Bid newBid = new Bid(); newItem.addBid(newBid); // Set both sides of the association session.save(newItem); session.save(newBid);  The second call to session.save() seems redundant, if we’re talking about a true parent/children relationship.  How to remove this redundancy??  - solution is to enable transitive persistence © JBoss, Inc. 2003, 2004. 9
  • 10. Transitive persistence Professional Open Source™  When you instantiate a new Bid and add it to an Item, the bid should become persistent automatically. You’d like to avoid making the Bid persistent explicitly with an extra save() operation.  To enable this transitive state across the association, add a cascade option to the XML mapping:  <class name="Item“ table="ITEM">  ...  <set name="bids“ inverse="true“ cascade="save-update">  <key column="ITEM_ID"/>  <one-to-many class="Bid"/>  </set>  </class>  The cascade="save-update" attribute enables transitive persistence for Bid instances, if a particular Bid is referenced by a persistent Item, in the collection. © JBoss, Inc. 2003, 2004. 10
  • 11. Cascading for delete operation Professional Open Source™  <set name="bids“ inverse="true“  cascade="save-update, delete"> © JBoss, Inc. 2003, 2004. 11
  • 12. Considering Bag for one-to-many associations Professional Open Source™  Bags have the most efficient performance characteristics of all the collections you can use for a bidirectional one-to-many entity association (in other words, if the collection side is inverse="true"). By default, collections in Hibernate are loaded only when they’re accessed for the first time in the application. Because a bag doesn’t have to maintain the index of its elements (like a list) or check for  duplicate elements (like a set), you can add new elements to the bag without triggering the loading. This is an important feature if you’re going to map a possibly large collection of entity references.  On the other hand, you can’t eager-fetch two collections of bag type simultaneously (for example, if bids and images of an Item were one- to-many bags). © JBoss, Inc. 2003, 2004. 12
  • 13. Mapping Bag for one-to-many associations Professional Open Source™ You rename the <set> element to <bag>, making no other changes. A bag also allows duplicate elements, which the set you mapped earlier didn’t. It turns out that this isn’t relevant in this case, because duplicate means you’ve added a particular reference to the same Bid instance several times. You wouldn’t do this in your application code. But even if you add the same reference several times to this collection, Hibernate ignores it—it’s mapped inverse. © JBoss, Inc. 2003, 2004. 13
  • 14. Unidirectional lists for one-to-many Professional Open Source™  If you need a real list to hold the position of the elements in a collection, you have to store that position in an additional column.  The additional column that holds the position of a reference to a Bid instance is the BID_POSITION, in the mapping of Item: Bid table will look like below : © JBoss, Inc. 2003, 2004. 14
  • 15. Unidirectional List for one-to-many Professional Open Source™  This mapping isn’t really complete.  Consider the ITEM_ID foreign key column : It’s NOT NULL (a bid has to reference an item). The first problem is that you don’t  specify this constraint in the mapping.  Also, because this mapping is unidirectional (the collection is non inverse), you have to assume that there is no opposite side mapped to the same foreign key column (where this constraint could be declared). You need to add a not-null="true" attribute to the <key>  element of the collection mapping: © JBoss, Inc. 2003, 2004. 15
  • 16. Bidirectional List for one-to-many – The problem Professional Open Source™  U might want to add a <many-to-one> on the ITEM_ID foreign key column to make this association bidirectional, and enable  inverse="true" on the collection as follows : <many-to-one name="item“ class="Item" column="ITEM_ID“ not-null="true"/> <list name="bids" inverse="true"> <key column="ITEM_ID"/> <list-index column=“BID_POSITION”/> <one-to-many class="Bid"/> </list>  Remember that Hibernate ignores the state of an inverse collection! This time, however, the collection contains information that is needed to update the database correctly: the position of its elements. If only the state of each Bid instance is considered for synchronization, and the collection is inverse and ignored, Hibernate has no value for the BID_POSITION column. © JBoss, Inc. 2003, 2004. 16
  • 17. Bidirectional List for one-to-many – The Solution Professional Open Source™  If you map a bidirectional one-to-many entity association with an indexed collection , you have to switch the inverse sides.  You can’t make an indexed collection inverse="true". The collection becomes responsible for state synchronization, and the one side, the Bid, has to be made inverse.  However, there is no inverse="true" for a many-to-one mapping so you need to simulate this attribute on a <many-to-one>: Setting insert and update to false has the desired effect. These two attributes used together make a property effectively read- only. This side of the association is therefore ignored for any write operations, and the state of the collection (including the index of the elements) is the relevant state when the in-memory state is synchronized with the database. © JBoss, Inc. 2003, 2004. 17
  • 18. Optional one-to-many association – The problem Professional Open Source™  A useful addition to the Item class is a buyer property. You can then call anItem.getBuyer() to access the User who made the winning bid.  From the point of view of the User class, the association is one-to- many. One user can buy many items and one item can be bought only by one user. But one user may not but any items and an item may not have been bought. So this is optional one-to-many association .  You expect a BUYER_ID foreign key column in the ITEM table. The column has to be nullable—a particular Item may not have been bought.  You can accept that the foreign key column can be NULL and apply additional constraints . But this is not a good design © JBoss, Inc. 2003, 2004. 18
  • 19. Optional one-to-many association – The solution with join table Professional Open Source™  An optional entity association, be it one-to-one or one-to-many, is best represented in an SQL database with a join table.  In the current case, you have a one-to-many multiplicity, so only the ITEM_ID column of the ITEM_BUYER table is unique. A particular  item can be bought only once. But one user can buy many items © JBoss, Inc. 2003, 2004. 19
  • 20. Optional one-to-many association – mapping Professional Open Source™ You use a Set as the collection type. The collection table is the join table, ITEM_BUYER; its primary key is a composite of USER_ID and ITEM_ID. <many-to-many> required because the regular <one-to-many> doesn’t know anything about join tables. By forcing a unique constraint on the foreign key column that references the target entity table, you effectively force a one-to-many multiplicity. © JBoss, Inc. 2003, 2004. 20
  • 21. Optional one-to-many association – making bidirectional Professional Open Source™  You can map this association bidirectional with the buyer property of Item. Without the join table, you’d add a <many-to-one> with a USER_ID foreign key column in the ITEM table. With the join table, you have to move this foreign key column into the join table. This is possible with a <join> mapping: Two important details: First, the association is optional, and you tell Hibernate not to insert a row into the join table if the grouped properties (only one here, buyer) are null. © JBoss, Inc. 2003, 2004. 21
  • 22. Professional Open Source™  Second, this is a bidirectional entity association. As always, one of the  side has to be the inverse end. You’ve chosen the <join> to be inverse; Hibernate now uses the collection state to synchronize the database and ignores the state of the Item.buyer property.  As long as your collection is not an indexed variation (a  list, map, or array), you can reverse this by declaring the collection inverse="true". © JBoss, Inc. 2003, 2004. 22
  • 23. One to one entity association Professional Open Source™  The relationship between User and Address are best represented with a <component> mapping .  If Address in made as an entity instead of a value type, the benefit is the possibility of shared references. In such a case , User and Address classes have a true one-to-one association. © JBoss, Inc. 2003, 2004. 23
  • 24. Shared primary key associations (one to one) Professional Open Source™  Rows in two tables related by a primary key association share the same primary key values.  The main difficulty with this approach is ensuring that associated instances are assigned the same primary key value when the objects are saved.  First you need a new property in the User class: Next, map the association in User.hbm.xml: © JBoss, Inc. 2003, 2004. 24
  • 25. Shared primary key associations (one to one) Professional Open Source™  You add a cascading option that is natural for this model: If a User instance is made persistent, you usually also want its shippingAddress to become persistent.  Hence, the following code is all that is needed to save both objects: Hibernate inserts a row into the USERS table and a row into the ADDRESS table. But wait, this doesn’t work! How can Hibernate possibly know that the record in the ADDRESS table needs to get the same primary key value as the USERS row? You need to enable a special identifier generator. © JBoss, Inc. 2003, 2004. 25
  • 26. The foreign identifier generator Professional Open Source™  If an Address instance is saved, it needs to get the primary key value of a User object.  The special foreign identifier generator for Address has to know where to get the right primary key value.  The first step to create this identifier binding between Address and User is a bidirectional association. Add a new user property to the Address entity: Map the new user property of an Address in Address.hbm.xml: © JBoss, Inc. 2003, 2004. 26
  • 27. The foreign identifier generator .. contd Professional Open Source™  This mapping not only makes the association bidirectional, but also, with constrained=“true", adds a foreign key constraint linking the primary key of the ADDRESS table to the primary key of the USERS table. In other words, the database guarantees that an ADDRESS row’s primary key references a valid USERS primary key.  You can now use the special foreign identifier generator for Address objects: © JBoss, Inc. 2003, 2004. 27
  • 28. The foreign identifier generator .. contd Professional Open Source™  Read it as follows: When an Address is saved, the primary key value is taken from the user property. The user property is a reference  to a User object;  Hence, the primary key value that is inserted is the same  as the primary key value of that instance. Look at the table structure in figure below : © JBoss, Inc. 2003, 2004. 28
  • 29. One-to-one foreign key associations Professional Open Source™  Instead of sharing a primary key, two rows can have a foreign key relationship.  One table has a foreign key column that references the primary key of the associated table. (The source and target of this foreign key constraint can even be the same table: This is called a self- referencing relationship)  Let’s change the mapping from a User to an Address. Instead of the shared primary key, you now add a SHIPPING_ADDRESS_ID column in the USERS table: © JBoss, Inc. 2003, 2004. 29
  • 30. One-to-one foreign key associations Professional Open Source™  The mapping element in XML for this association is <many-to-one>— not <one-to-one>, as you might have expected. The reason is simple: You don’t care what’s on the target side of the association, so you can treat it like a to-one association without the many part. All you want is to express “This entity has a property that is a reference to an instance of another entity” and use a foreign key field to represent  that relationship. The database schema for this mapping is shown as below : © JBoss, Inc. 2003, 2004. 30
  • 31. One-to-one foreign key associations Professional Open Source™  An additional constraint enforces this relationship as a real one to one. By making the SHIPPING_ADDRESS_ID column unique, you declare that a particular address can be referenced by at most one user, as a shipping address  Let’s make the association from User to Address bidirectional.  The last foreign key association was mapped from User to Address with <many-to-one> and a unique constraint to guarantee the desired multiplicity.  What mapping element can you add on the Address side to make this association bidirectional, so that access from Address to User is possible in the Java domain model? See below … You tell Hibernate that the user property of the Address class is the inverse of a property on the other side of the association. © JBoss, Inc. 2003, 2004. 31
  • 32. Mapping with a join table – optional one-to-one Professional Open Source™  Let us think of optional one-to-one association between Person and Desk . i.e, A person may be allocated a desk or not and a desk may be allocated to a person or not .But a person should be allocated atmost one desk and a desk must be allocated to atmost one Person  To make one-to-one optional , we can use foreign key strategy .Let us assume that Person is having the foreign key. We can map this one- to-one relation as follows :  <many-to-one name=“desk" class=“Desk" cascade="save-update"  column=“DESK_ID" unique="true" />  As not-null=“false” by default for this many-to-one , the association from person to desk is optional .  What about the association from Desk to Person ? – Solution is We need a join table © JBoss, Inc. 2003, 2004. 32
  • 33. Using Join table Professional Open Source™  Let us assume that ASSIGNMENT is the name of join table.  This table has only two columns: PERSON_ID and DESK_ID. The multiplicity of these foreign key columns is enforced with a unique constraint on both—a particular person and desk can only be assigned once, and only one such an assignment can exist.  As another example consider optional one-to-one association between Item and Shipment . It can be represented as follows with the join table . © JBoss, Inc. 2003, 2004. 33
  • 34. Mapping for join table Professional Open Source™ The join table has two foreign key columns: SHIPMENT_ID, referencing the primary key of the SHIPMENT table; and ITEM_ID, referencing the ITEM table. The ITEM_ID column is unique; a particular item can be assigned to exactly one shipment. Because the primary key of the join table is SHIPMENT_ID, which makes this column also unique, you have a guaranteed one-to-one multiplicity between Shipment and Item. By setting optional="true" on the <join> mapping, you tell Hibernate that it should insert a row into the join table only if the properties grouped by this mapping are non-null. But if a row needs to be inserted , the NOT NULL constraint on the ITEM_ID column applies. © JBoss, Inc. 2003, 2004. 34
  • 35. unidirectional many-to-many association Professional Open Source™ The join table has two columns: the foreign keys of the CATEGORY and ITEM tables. The primary key is a composite of both columns. © JBoss, Inc. 2003, 2004. 35
  • 36. unidirectional many-to-many association with <idbag> Professional Open Source™ With an <idbag> mapping, the primary key is a surrogate key column, CATEGORY_ITEM_ID. Duplicate links are therefore allowed; © JBoss, Inc. 2003, 2004. 36
  • 37. A bidirectional many-to-many association Professional Open Source™  One side in a bidirectional association has to be mapped as inverse because you have named the foreign key column(s) twice. You have enabled cascade="save-update" for both ends of the collection. On the other hand, the cascading options all, delete, and delete-orphans aren’t meaningful for many-to- many associations. © JBoss, Inc. 2003, 2004. 37