CatDAOImpl and DogDAOImpl

Figure 1. One table per concrete class - DAO implementations for the concrete classes
package curam.inheritance;

import java.util.Set;

import com.google.inject.Singleton;

import curam.inheritance.Cat;
import curam.inheritance.CatDAO;
import curam.inheritance.struct.CatDtls;
import curam.util.persistence.StandardDAOImpl;

@Singleton
public class CatDAOImpl extends StandardDAOImpl<Cat, CatDtls>
    implements CatDAO {
  private static final CatAdapter adapter = new CatAdapter();

  /**
   * Protected no-arg constructor for use only by Guice
   */
  protected CatDAOImpl() {
    super(adapter, Cat.class);
  }

  public Set<Cat> readAllCats() {
    return newSet(adapter.readAll());
  }

}
package curam.inheritance;

import java.util.Set;

import com.google.inject.Singleton;

import curam.inheritance.Dog;
import curam.inheritance.DogDAO;
import curam.inheritance.struct.DogDtls;
import curam.util.persistence.StandardDAOImpl;

@Singleton
public class DogDAOImpl extends StandardDAOImpl<Dog, DogDtls>
    implements DogDAO {
  private static final DogAdapter adapter = new DogAdapter();

  /**
   * Protected no-arg constructor for use only by Guice
   */
  protected DogDAOImpl() {
    super(adapter, Dog.class);
  }

  public Set<Dog> readAllDogs() {
    return newSet(adapter.readAll());
  }

}

The DAO classes for the concrete classes are straightforward DAO implementations.

CatDAOImpl and DogDAOImpl each support the creation of new instances of their respective entities, as well as retrieval of existing instances, by making use of the StandardDAOImpl class.