Single table per class hierarchy
This approach may be considered the most simple: We just create one database table for storing instances of arbitrary classes belonging to the inheritance hierarchy in question:
Todo: Ref/Fig/billingData.fig
Fitting both inherit.v1.CreditCard and
                               inherit.v1.BankAccount instances into a
                               single relation.
                  
The relation may be created by the following DDL:
Todo: Ref/Fig/billingSql.fig
We take a closer look at the generated relation. Since
| Java | package inherit.v1;
            ...
	    @Entity
	    @Inheritance(strategy=InheritanceType.SINGLE_TABLE) ❶
	    @DiscriminatorColumn(name="dataType", discriminatorType=DiscriminatorType.STRING) ❷
	    abstract class BillingDetails {
	    @Id @GeneratedValue ❸ public Long getId() ...
	    @Column(nullable = false, length = 32)public final String getNumber() ...
	    @Temporal(TemporalType.TIMESTAMP)
	    @Column(nullable = false) public Date getCreated() ...package inherit.v1;
	    ...
	    @Entity
	    @DiscriminatorValue(value = "Credit card" ❶)
	    public class CreditCard extends BillingDetails {
	    ... //Nothing JPA related happens herepackage inherit.v1;
	    ...
	    @Entity
	    @DiscriminatorValue(value = "Bank account" ❶)
	    public class BankAccount extends BillingDetails {
	    ... //Nothing JPA related happens here | 
| Sql | CREATE TABLE BillingDetails ❶ ( dataType varchar(31) NOT NULL, id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, number varchar(255) NOT NULL, ❷ created datetime NOT NULL, ❸ cardType int(11) DEFAULT NULL, ❹ expiration datetime DEFAULT NULL, ❺ bankName varchar(255) DEFAULT NULL, ❻ swiftcode varchar(255) DEFAULT NULL ❼ ) | 
| All classes of the inheritance hierarchy will be mapped to a
                                       single table. Unless stated otherwise the JPA provider will choose the root class' name
                                       ( | |
| The JPA provider needs a column to
                                       distinguish the different types of database objects. We've chosen
                                       the discriminator attribute  
 In a productive system the
                                        | |
| This one is unrelated to inheritance: Our primary key values
                                       will be auto generated by the database server e.g. by
                                        | |
| Only the base class' attributes may exclude
                                        | |
| All derived classes' attributes must allow  | 
We may now insert instances of
                       inherit.v1.BankAccount or
                       inherit.v1.CreditCard:
            
package inherit.v1;
	  ...
	  public class Persist {
	  public static void main(String[] args) throws ParseException {
	  ... final Transaction transaction = session.beginTransaction();
	  {
          final CreditCard creditCard = new CreditCard("4412 8334 4512 9416", 1, "05/18/15");
          session.save(creditCard);
          
          final BankAccount bankAccount = new BankAccount("1107 2 31", "Lehman Brothers", "BARCGB22");
          session.save(bankAccount);
	  }
	  transaction.commit(); ...