Mapped SuperClass Support

Devender Yadav edited this page Jun 9, 2016 · 14 revisions
Clone this wiki locally

Introduction

Mapped super class is used to define state and mapping information that is common to multiple entity classes.For further details refer github#56

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

A sample class annotated with @MappedSuperclass

@MappedSuperclass
public class Transaction 
{

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

    
    @Column
    private Date transactionDt;

CreditTransaction :

@Entity
@Table(name = "TRNX_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;

DebitTransaction :

@Entity
@AttributeOverride(name="bankIdentifier",column= @Column(name="CREDIT_BANK_IDENT"))
@IndexCollection(columns={@Index(name="bankIdentifier")})
public class DebitTransaction extends Transaction
{

    @Column
    private Integer amount;

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

Inheritance Strategy:

Sample Transaction Use Case : A sample class annotated with @Entity .This class is inherited by transaction type entities and depending on inheritance strategy the data is persisted accordingly.

@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);

        waitThread(wait);
        em.clear();
        String creditQuery = "Select c from CreditTransaction c where c.bankIdentifier = 'sbi'";

        Query query = em.createQuery(creditQuery);

        List<CreditTransaction> results = query.getResultList();
        Assert.assertEquals(1, results.size());
        Assert.assertEquals("credit1", results.get(0).getTxId());

        em.clear();
        String debitQuery = "Select d from DebitTransaction d where d.bankIdentifier = 'sbi'";

        query = em.createQuery(debitQuery);

        List<DebitTransaction> debitResults = query.getResultList();
        Assert.assertEquals(1, debitResults.size());
        Assert.assertEquals("debit1", debitResults.get(0).getTxId());

###Benefits

  • Mapped Superclass and inheritance Strategy will enable the traditional(normalized) relational database migration to NoSQL.

###To-Do

  • Enable join table support