Enterprise Java Development@TOPIC@

Chapter 49. Composite Primary Keys

49.1. Example Composite Primary Key Class
49.2. Composite @IdClass
49.3. Composite @EmbeddedId
49.4. Composite Overrides
49.5. Composite Primary Key Summary
package ejava.examples.orm.core;


import java.io.Serializable;
public class MowerPK implements Serializable {
    private static final long serialVersionUID = 1L;
    private String make;
    private String model;
    
    public MowerPK() {}
    public MowerPK(String make, String model) {
        this.make = make;
        this.model = model;
    }
    public String getMake() { return make; }
    public String getModel() { return model; }
    
    @Override
    public int hashCode() { return make.hashCode() + model.hashCode(); }
    @Override
    public boolean equals(Object obj) {
        try {
            if (this == obj) return true;
            return make.equals(((MowerPK)obj).getMake()) &&
                   model.equals(((MowerPK)obj).getModel());
            
        } catch (Throwable ignored) { //catch NP & Cast Exceptions 
            return false;
        }
    }
...    
}



Figure 49.4. Composite @IdClass Example Client

  • Create Entity with Composite ID

    ejava.examples.orm.core.annotated.Mower mower =  new Mower("acme", "power devil2");
    
    mower.setSize(21);
    //insert a row in the database
    logger.info("persisting mower(tx={}): {}", txActive(), mower);
    em.persist(mower);
    logger.info("created mower: {}", mower);
    em.flush();
    logger.info("flushed");
    -persisting mower(tx=true): 1756435781, make=acme, model=power devil2, size=21
    
    -created mower: 1756435781, make=acme, model=power devil2, size=21
    -insert into ORMCORE_MOWER (size, make, model) values (?, ?, ?)
    -binding parameter [1] as [INTEGER] - [21]
    -binding parameter [2] as [VARCHAR] - [acme]
    -binding parameter [3] as [VARCHAR] - [power devil2]
    -flushed
  • Get Instance by Composite ID

    //locate instance by ID, while instance still managed        
    
    Mower mower2 = em.find(Mower.class, new MowerPK("acme", "power devil2"));
    assertNotNull(mower2);
    logger.info("found mower: {}", mower2);
    assertEquals(mower.getSize(), mower2.getSize());        
    -found mower: 1756435781, make=acme, model=power devil2, size=21
    
    • Instance is found in cache by ID without having to query database

  • Remove Instance from Database

    em.remove(mower2);
    
    logger.info("removed mower: {}", mower2);
    em.flush();
    logger.info("removed mower after flush: {}", mower2);
    Mower mower3 = em.find(Mower.class, new MowerPK("acme", "power devil2"));
    assertNull(mower3);
    -removed mower: 1756435781, make=acme, model=power devil2, size=21
    
    -delete from ORMCORE_MOWER 
     where make=? and model=?
    -binding parameter [1] as [VARCHAR] - [acme]
    -binding parameter [2] as [VARCHAR] - [power devil2]
    -removed mower after flush: 1756435781, make=acme, model=power devil2, size=21
    -select mower0_.make as make1_7_0_, mower0_.model as model2_7_0_, mower0_.size as size3_7_0_ 
     from ORMCORE_MOWER mower0_ 
     where mower0_.make=? and mower0_.model=?
    -binding parameter [1] as [VARCHAR] - [acme]
    -binding parameter [2] as [VARCHAR] - [power devil2]
    • Row removed from database and instance detached

    • Primary key used to query database since instance no longer in cache