Skip to content

Mapped SuperClass Support

chhavigangwal edited this page Oct 18, 2013 · 15 revisions

Introduction:

Mapped super class is used to define state and mapping information that is common to multiple entity classes.It is a super class which does not have any separate table.It is never be a part of persistent relationship and can be concrete or an abstract class. Kundera has now enabled Mapped super class support.

Why Support it ?

In order to become a stronger JPA provider and enable support of traditional normalized schema Kundera has also enabled support of Mapped Superclasses and Inheritance strategy.

Mapped SuperClass as concrete class :

Sample Transaction use case

@MappedSuperclass
@Table(name = "TRNX")
public class Transaction 
{

    @Id
    private String txId;
    
    @Column
    private String bankIdentifier;

    
    @Column
    private Date transactionDt;

CreditTransaction :

@Entity
@Table(name = "TRNX_CREDIT")
@IndexCollection(columns={@Index(name="bankIdentifier")})
public class CreditTransaction extends Transaction
{

    @Column
    private Integer amount;

    @Column
    @Enumerated(EnumType.STRING)
    private Status txStatus;

DebitTransaction :

@Entity
@DiscriminatorValue(value="DEBIT")
@IndexCollection(columns={@Index(name="bankIdentifier")})
public class DebitTransaction extends Transaction
{

    @Column
    private Integer amount;

    @Column
    @Enumerated(EnumType.STRING)
    private Status txStatus;

Inheritance Strategy:

It can be implemented in two ways :

  • Discriminator column
  • Attribute Override

Sample Transaction Use Case :

@Entity
@Table(name = "TRNX")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tx_type")
public class Transaction extends AbstractTransaction
{
    
    @Column
    private String bankIdentifier;

CreditTransaction :

@Entity
@Table(name = "TRNX_CREDIT")
@DiscriminatorValue(value = "CREDIT")
@AttributeOverride(name="bankIdentifier",column= @Column(name="CREDIT_BANK_IDENT"))
@IndexCollection(columns={@Index(name="bankIdentifier")})
public class CreditTransaction extends Transaction
{

    @Column
    private Integer amount;

    @Column
    @Enumerated(EnumType.STRING)
    private Status txStatus;

Debit Transaction :


@Entity
@DiscriminatorValue(value="DEBIT")
@AttributeOverrides(value = { @AttributeOverride(name = "txId", column = @Column(name = "DEBIT_ID")),
@AttributeOverride(name = "bankIdentifier", column = @Column(name = "DEBIT_BANK_IDENT")),
@AttributeOverride(name = "transactionDt", column = @Column(name = "TX_DT")) })
public class DebitTransaction extends Transaction
{

    @Column
    private Integer amount;

Entity Transaction :

        CreditTransaction creditTx = new CreditTransaction();
        creditTx.setTxId("credit1");
        creditTx.setTxStatus(Status.APPROVED);
        creditTx.setBankIdentifier("sbi");
        creditTx.setTransactionDt(new Date());
        creditTx.setAmount(10);
        em.persist(creditTx);

        waitThread(wait);

        DebitTransaction debitTx = new DebitTransaction();
        debitTx.setTxId("debit1");
        debitTx.setTxStatus(Status.PENDING);
        debitTx.setTransactionDt(new Date());
        debitTx.setBankIdentifier("sbi");
        debitTx.setAmount(-10);
        em.persist(debitTx);

Benefits :

  • Mapped Superclass and inheritance Strategy enable tradition normalized relational database schema support.
  • Another advantage of enabling the same is that attributes that are common to multiple persistent classes can be defined in the superclass without having to suffer the performance consequences.

To-do :

  • Enable join table support
Clone this wiki locally