http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java
index 1c8f85c..2ef69a5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java
@@ -42,6 +42,7 @@ import javax.persistence.TemporalType;
 import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
@@ -51,7 +52,6 @@ import 
org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
 import 
org.apache.fineract.portfolio.charge.exception.SavingsAccountChargeWithoutMandatoryFieldException;
 import org.joda.time.LocalDate;
 import org.joda.time.MonthDay;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 /**
  * @author dv6
@@ -59,7 +59,7 @@ import 
org.springframework.data.jpa.domain.AbstractPersistable;
  */
 @Entity
 @Table(name = "m_savings_account_charge")
-public class SavingsAccountCharge extends AbstractPersistable<Long> {
+public class SavingsAccountCharge extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "savings_account_id", referencedColumnName = "id", 
nullable = false)
@@ -704,15 +704,6 @@ public class SavingsAccountCharge extends 
AbstractPersistable<Long> {
                 .isEquals();
     }
 
-    @Override
-    public int hashCode() {
-        return new HashCodeBuilder(3, 5) //
-                .append(getId()) //
-                //.append(this.charge.getId()) //
-                .append(this.amount).append(getDueLocalDate()) //
-                .toHashCode();
-    }
-
     public BigDecimal updateWithdralFeeAmount(final BigDecimal 
transactionAmount) {
         BigDecimal amountPaybale = BigDecimal.ZERO;
         if (ChargeCalculationType.fromInt(this.chargeCalculation).isFlat()) {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java
index 0d0bb17..04d6c6b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java
@@ -26,11 +26,11 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_savings_account_charge_paid_by")
-public class SavingsAccountChargePaidBy extends AbstractPersistable<Long> {
+public class SavingsAccountChargePaidBy extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "savings_account_transaction_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java
index bc0652a..bd9645c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java
@@ -31,6 +31,6 @@ public interface SavingsAccountChargeRepository extends 
JpaRepository<SavingsAcc
 
     SavingsAccountCharge findByIdAndSavingsAccountId(Long id, Long 
savingsAccountId);
 
-    @Query("from SavingsAccountCharge sac where sac.dueDate <=:transactionDate 
and sac.waived = 0 and sac.paid=0 order by sac.dueDate")
+    @Query("select sac from SavingsAccountCharge sac where sac.dueDate 
<=:transactionDate and sac.waived = 0 and sac.paid=0 order by sac.dueDate")
     List<SavingsAccountCharge> findPendingCharges(@Param("transactionDate") 
Date transactionDate);
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java
index 5a28d66..df939f6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java
@@ -28,25 +28,25 @@ import org.springframework.data.repository.query.Param;
 //Use SavingsAccountRepositoryWrapper.
 public interface SavingsAccountRepository extends 
JpaRepository<SavingsAccount, Long>, JpaSpecificationExecutor<SavingsAccount> {
 
-    @Query("from SavingsAccount s_acc where s_acc.client.id = :clientId")
+    @Query("select s_acc from SavingsAccount s_acc where s_acc.client.id = 
:clientId")
     List<SavingsAccount> findSavingAccountByClientId(@Param("clientId") Long 
clientId);
 
-    @Query("from SavingsAccount s_acc where s_acc.status = :status")
+    @Query("select s_acc from SavingsAccount s_acc where s_acc.status = 
:status")
     List<SavingsAccount> findSavingAccountByStatus(@Param("status") Integer 
status);
 
-    @Query("from SavingsAccount sa where sa.client.id = :clientId and 
sa.group.id = :groupId")
+    @Query("select sa from SavingsAccount sa where sa.client.id = :clientId 
and sa.group.id = :groupId")
     List<SavingsAccount> findByClientIdAndGroupId(@Param("clientId") Long 
clientId, @Param("groupId") Long groupId);
 
-    @Query("select case when (count (saving) > 0) then true else false end 
from SavingsAccount saving where saving.client.id = :clientId and saving.status 
in (100,200,300,303,304)")
+    @Query("select case when (count (saving) > 0) then 'true' else 'false' end 
from SavingsAccount saving where saving.client.id = :clientId and saving.status 
in (100,200,300,303,304)")
     boolean doNonClosedSavingAccountsExistForClient(@Param("clientId") Long 
clientId);
 
-    @Query("from SavingsAccount sa where sa.client.id is null and sa.group.id 
= :groupId")
+    @Query("select sa from SavingsAccount sa where sa.client.id is null and 
sa.group.id = :groupId")
     List<SavingsAccount> findByGroupId(@Param("groupId") Long groupId);
 
-    @Query("from SavingsAccount sa where sa.id = :accountId and sa.depositType 
= :depositAccountTypeId")
+    @Query("select sa from SavingsAccount sa where sa.id = :accountId and 
sa.depositType = :depositAccountTypeId")
     SavingsAccount findByIdAndDepositAccountType(@Param("accountId") Long 
accountId,
             @Param("depositAccountTypeId") Integer depositAccountTypeId);
 
-    @Query("from SavingsAccount sa where sa.accountNumber = :accountNumber and 
sa.status in (100, 200, 300, 303, 304) ")
+    @Query("select sa from SavingsAccount sa where sa.accountNumber = 
:accountNumber and sa.status in (100, 200, 300, 303, 304) ")
     SavingsAccount findNonClosedAccountByAccountNumber(@Param("accountNumber") 
String accountNumber);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
index c2f2cf4..166f6ed 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
@@ -39,6 +39,7 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.infrastructure.core.domain.LocalDateInterval;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
@@ -52,7 +53,6 @@ import 
org.apache.fineract.portfolio.savings.service.SavingsEnumerations;
 import org.apache.fineract.portfolio.tax.domain.TaxComponent;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 import org.springframework.util.CollectionUtils;
 
 /**
@@ -61,10 +61,10 @@ import org.springframework.util.CollectionUtils;
  */
 @Entity
 @Table(name = "m_savings_account_transaction")
-public final class SavingsAccountTransaction extends AbstractPersistable<Long> 
{
+public final class SavingsAccountTransaction extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
-    @JoinColumn(name = "savings_account_id", nullable = false)
+    @JoinColumn(name = "savings_account_id", referencedColumnName="id", 
nullable = false)
     private SavingsAccount savingsAccount;
 
     @ManyToOne
@@ -76,11 +76,11 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
     private PaymentDetail paymentDetail;
 
     @Column(name = "transaction_type_enum", nullable = false)
-    private final Integer typeOf;
+    private Integer typeOf;
 
     @Temporal(TemporalType.DATE)
     @Column(name = "transaction_date", nullable = false)
-    private final Date dateOf;
+    private  Date dateOf;
 
     @Column(name = "amount", scale = 6, precision = 19, nullable = false)
     private BigDecimal amount;
@@ -88,28 +88,28 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
     @Column(name = "is_reversed", nullable = false)
     private boolean reversed;
 
-    @Column(name = "running_balance_derived", scale = 6, precision = 19, 
nullable = false)
+    @Column(name = "running_balance_derived", scale = 6, precision = 19, 
nullable = true)
     private BigDecimal runningBalance;
 
-    @Column(name = "cumulative_balance_derived", scale = 6, precision = 19, 
nullable = false)
+    @Column(name = "cumulative_balance_derived", scale = 6, precision = 19, 
nullable = true)
     private BigDecimal cumulativeBalance;
 
     @Temporal(TemporalType.DATE)
-    @Column(name = "balance_end_date_derived", nullable = false)
+    @Column(name = "balance_end_date_derived", nullable = true)
     private Date balanceEndDate;
 
-    @Column(name = "balance_number_of_days_derived", nullable = false)
+    @Column(name = "balance_number_of_days_derived", nullable = true)
     private Integer balanceNumberOfDays;
 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = 
"savingsAccountTransaction", orphanRemoval = true, fetch=FetchType.EAGER)
-    private final Set<SavingsAccountChargePaidBy> savingsAccountChargesPaid = 
new HashSet<>();
+    private Set<SavingsAccountChargePaidBy> savingsAccountChargesPaid = new 
HashSet<>();
 
     @Column(name = "overdraft_amount_derived", scale = 6, precision = 19, 
nullable = true)
     private BigDecimal overdraftAmount;
 
     @Temporal(TemporalType.TIMESTAMP)
     @Column(name = "created_date", nullable = false)
-    private final Date createdDate;
+    private Date createdDate;
 
     @ManyToOne
     @JoinColumn(name = "appuser_id", nullable = true)
@@ -117,7 +117,7 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
 
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, 
fetch=FetchType.EAGER)
     @JoinColumn(name = "savings_transaction_id", referencedColumnName = "id", 
nullable = false)
-    private final List<SavingsAccountTransactionTaxDetails> taxDetails = new 
ArrayList<>();
+    private List<SavingsAccountTransactionTaxDetails> taxDetails = new 
ArrayList<>();
 
     protected SavingsAccountTransaction() {
         this.dateOf = null;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java
index 4c13b67..38d5878 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java
@@ -26,13 +26,13 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.portfolio.tax.domain.TaxComponent;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_savings_account_transaction_tax_details")
-public class SavingsAccountTransactionTaxDetails extends 
AbstractPersistable<Long> {
+public class SavingsAccountTransactionTaxDetails extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "tax_component_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java
index aadf2ca..ba4b4f7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java
@@ -23,6 +23,9 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.accounti
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.allowOverdraftParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.chargesParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.currencyCodeParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToDormancyParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToEscheatParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToInactiveParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.descriptionParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.digitsAfterDecimalParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.enforceMinRequiredBalanceParamName;
@@ -31,6 +34,7 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.interest
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.interestCalculationTypeParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.interestCompoundingPeriodTypeParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.interestPostingPeriodTypeParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.isDormancyTrackingActiveParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.localeParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.lockinPeriodFrequencyParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.lockinPeriodFrequencyTypeParamName;
@@ -43,13 +47,9 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalA
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalAnnualInterestRateParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.overdraftLimitParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.shortNameParamName;
-import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
-import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.isDormancyTrackingActiveParamName;
-import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToInactiveParamName;
-import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToDormancyParamName;
-import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToEscheatParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -78,6 +78,7 @@ import 
org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.ApiParameterError;
 import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.portfolio.charge.domain.Charge;
@@ -89,7 +90,6 @@ import 
org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType;
 import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType;
 import org.apache.fineract.portfolio.tax.domain.TaxGroup;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 import com.google.gson.JsonArray;
 
@@ -99,7 +99,7 @@ import com.google.gson.JsonArray;
 @Inheritance
 @DiscriminatorColumn(name = "deposit_type_enum", discriminatorType = 
DiscriminatorType.INTEGER)
 @DiscriminatorValue("100")
-public class SavingsProduct extends AbstractPersistable<Long> {
+public class SavingsProduct extends AbstractPersistableCustom<Long> {
 
     @Column(name = "name", nullable = false, unique = true)
     protected String name;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java
index 5f2834d..51ffb4f 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java
@@ -256,7 +256,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
                 depositAccountOnHoldTransactions = 
this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account);
             }
             
account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions);
-            this.savingAccountRepositoryWrapper.save(account);
+            this.savingAccountRepositoryWrapper.saveAndFlush(account);
         }
 
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
@@ -354,7 +354,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
 
             
account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions);
 
-            this.savingAccountRepositoryWrapper.save(account);
+            this.savingAccountRepositoryWrapper.saveAndFlush(account);
         }
 
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
@@ -440,7 +440,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
     }
 
     private Long saveTransactionToGenerateTransactionId(final 
SavingsAccountTransaction transaction) {
-        this.savingsAccountTransactionRepository.save(transaction);
+        this.savingsAccountTransactionRepository.saveAndFlush(transaction);
         return transaction.getId();
     }
 
@@ -538,7 +538,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
         final MathContext mc = new MathContext(10, 
MoneyHelper.getRoundingMode());
         boolean isInterestTransfer = false;
         account.postInterest(mc, today, isInterestTransfer, 
isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth);
-        this.savingAccountRepositoryWrapper.save(account);
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
 
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
     }
@@ -629,6 +629,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
 
         account.updateOverduePayments(overdueUptoDate);
 
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
 
         return new CommandProcessingResultBuilder() //
@@ -725,6 +726,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
         final LocalDate overdueUptoDate = DateUtils.getLocalDateOfTenant();
         account.updateOverduePayments(overdueUptoDate);
 
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
         return new CommandProcessingResultBuilder() //
                 .withEntityId(newtransactionId) //
@@ -926,7 +928,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
                 financialYearBeginningMonth);
 
         this.savingsAccountTransactionRepository.save(newTransferTransaction);
-        this.savingAccountRepositoryWrapper.save(savingsAccount);
+        this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         postJournalEntries(savingsAccount, existingTransactionIds, 
existingReversedTransactionIds);
 
@@ -959,7 +961,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
                 financialYearBeginningMonth);
 
         
this.savingsAccountTransactionRepository.save(withdrawtransferTransaction);
-        this.savingAccountRepositoryWrapper.save(savingsAccount);
+        this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         postJournalEntries(savingsAccount, existingTransactionIds, 
existingReversedTransactionIds);
 
@@ -1002,7 +1004,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
                 financialYearBeginningMonth);
 
         
this.savingsAccountTransactionRepository.save(acceptTransferTransaction);
-        this.savingAccountRepositoryWrapper.save(savingsAccount);
+        this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         postJournalEntries(savingsAccount, existingTransactionIds, 
existingReversedTransactionIds);
 
@@ -1289,7 +1291,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
 
         account.validateAccountBalanceDoesNotBecomeNegative("." + 
SavingsAccountTransactionType.PAY_CHARGE.getCode(),depositAccountOnHoldTransactions);
 
-        this.savingAccountRepositoryWrapper.save(account);
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
 
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
     }
@@ -1313,7 +1315,7 @@ public class 
DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
             ((RecurringDepositAccount) 
account).updateMaturityStatus(isSavingsInterestPostingAtCurrentPeriodEnd,
                     financialYearBeginningMonth);
         }
-
+        this.savingAccountRepositoryWrapper.saveAndFlush(account) ;
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
index 9dac460..1da6e8f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
@@ -30,7 +30,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccountType;
@@ -88,7 +91,6 @@ import 
org.apache.fineract.portfolio.savings.domain.SavingsProductRepository;
 import 
org.apache.fineract.portfolio.savings.exception.SavingsProductNotFoundException;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
-import org.joda.time.LocalTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -160,12 +162,11 @@ public class 
DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataAccessException dve) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
 
         final StringBuilder errorCodeBuilder = new 
StringBuilder("error.msg.").append(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME);
 
-        final Throwable realCause = dve.getMostSpecificCause();
-        if (realCause.getMessage().contains("sa_account_no_UNIQUE")) {
+        if (realCause.getMessage().contains("'sa_account_no_UNIQUE'")) {
             final String accountNo = 
command.stringValueOfParameterNamed("accountNo");
             errorCodeBuilder.append(".duplicate.accountNo");
             throw new 
PlatformDataIntegrityException(errorCodeBuilder.toString(), "Savings account 
with accountNo " + accountNo
@@ -235,7 +236,11 @@ public class 
DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
                     .withSavingsId(savingsId) //
                     .build();
         } catch (final DataAccessException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
+            return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -289,7 +294,11 @@ public class 
DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
                     .withSavingsId(savingsId) //
                     .build();
         } catch (final DataAccessException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
+            return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -435,8 +444,12 @@ public class 
DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
                     .with(changes) //
                     .build();
         } catch (final DataAccessException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return new CommandProcessingResult(Long.valueOf(-1));
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return new CommandProcessingResult(Long.valueOf(-1));
         }
     }
 
@@ -502,8 +515,12 @@ public class 
DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
                     .with(changes) //
                     .build();
         } catch (final DataAccessException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return new CommandProcessingResult(Long.valueOf(-1));
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return new CommandProcessingResult(Long.valueOf(-1));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java
index 3da5ef8..73bbcd5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java
@@ -28,6 +28,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.ApiParameterError;
@@ -98,8 +101,12 @@ public class 
FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements
                     .withEntityId(product.getId()) //
                     .build();
         } catch (final DataAccessException e) {
-            handleDataIntegrityIssues(command, e);
+            handleDataIntegrityIssues(command, e.getMostSpecificCause(), e);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -154,8 +161,12 @@ public class 
FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements
                     .withEntityId(product.getId()) //
                     .with(changes).build();
         } catch (final DataAccessException e) {
-            handleDataIntegrityIssues(command, e);
+            handleDataIntegrityIssues(command, e.getMostSpecificCause(), e);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -178,9 +189,8 @@ public class 
FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataAccessException dae) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dae) {
 
-        final Throwable realCause = dae.getMostSpecificCause();
         if (realCause.getMessage().contains("sp_unq_name")) {
 
             final String name = command.stringValueOfParameterNamed("name");
@@ -198,7 +208,7 @@ public class 
FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements
                 "Unknown data integrity issue with resource.");
     }
 
-    private void logAsErrorUnexpectedDataIntegrityException(final 
DataAccessException dae) {
+    private void logAsErrorUnexpectedDataIntegrityException(final Exception 
dae) {
         this.logger.error(dae.getMessage(), dae);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java
index 3309816..66b448d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java
@@ -19,7 +19,6 @@
 package org.apache.fineract.portfolio.savings.service;
 
 import static 
org.apache.fineract.portfolio.savings.DepositsApiConstants.RECURRING_DEPOSIT_PRODUCT_RESOURCE_NAME;
-import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_PRODUCT_RESOURCE_NAME;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.accountingRuleParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.chargesParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName;
@@ -29,6 +28,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.ApiParameterError;
@@ -99,8 +101,12 @@ public class 
RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem
                     .withEntityId(product.getId()) //
                     .build();
         } catch (final DataAccessException e) {
-            handleDataIntegrityIssues(command, e);
+            handleDataIntegrityIssues(command, e.getMostSpecificCause(), e);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+            Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -155,8 +161,12 @@ public class 
RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem
                     .withEntityId(product.getId()) //
                     .with(changes).build();
         } catch (final DataAccessException e) {
-            handleDataIntegrityIssues(command, e);
+            handleDataIntegrityIssues(command, e.getMostSpecificCause(), e);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -179,9 +189,8 @@ public class 
RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataAccessException dae) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dae) {
 
-        final Throwable realCause = dae.getMostSpecificCause();
         if (realCause.getMessage().contains("sp_unq_name")) {
 
             final String name = command.stringValueOfParameterNamed("name");
@@ -199,7 +208,7 @@ public class 
RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem
                 "Unknown data integrity issue with resource.");
     }
 
-    private void logAsErrorUnexpectedDataIntegrityException(final 
DataAccessException dae) {
+    private void logAsErrorUnexpectedDataIntegrityException(final Exception 
dae) {
         this.logger.error(dae.getMessage(), dae);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java
index 30ce57b..4c1451c 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java
@@ -202,7 +202,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
             final DateTimeFormatter fmt = 
DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale);
             processPostActiveActions(account, fmt, existingTransactionIds, 
existingReversedTransactionIds);
 
-            this.savingAccountRepositoryWrapper.save(account);
+            this.savingAccountRepositoryWrapper.saveAndFlush(account);
         }
 
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
@@ -280,7 +280,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
     }
 
     private Long saveTransactionToGenerateTransactionId(final 
SavingsAccountTransaction transaction) {
-        this.savingsAccountTransactionRepository.save(transaction);
+        this.savingsAccountTransactionRepository.saveAndFlush(transaction);
         return transaction.getId();
     }
 
@@ -413,7 +413,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
                 }
             }
 
-            this.savingAccountRepositoryWrapper.save(account);
+            this.savingAccountRepositoryWrapper.saveAndFlush(account);
 
             postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
         }
@@ -478,6 +478,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
         }
         
account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.undoTransactionAction,
 depositAccountOnHoldTransactions);
         account.activateAccountBasedOnBalance();
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
 
         return new CommandProcessingResultBuilder() //
@@ -566,6 +567,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
         }
         
account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.adjustTransactionAction,
 depositAccountOnHoldTransactions);
         account.activateAccountBasedOnBalance();
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
         return new CommandProcessingResultBuilder() //
                 .withEntityId(newtransactionId) //
@@ -687,7 +689,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
                 financialYearBeginningMonth);
 
         this.savingsAccountTransactionRepository.save(newTransferTransaction);
-        this.savingAccountRepositoryWrapper.save(savingsAccount);
+        this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         postJournalEntries(savingsAccount, existingTransactionIds, 
existingReversedTransactionIds);
 
@@ -717,7 +719,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
                 financialYearBeginningMonth);
 
         
this.savingsAccountTransactionRepository.save(withdrawtransferTransaction);
-        this.savingAccountRepositoryWrapper.save(savingsAccount);
+        this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         postJournalEntries(savingsAccount, existingTransactionIds, 
existingReversedTransactionIds);
 
@@ -758,7 +760,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
                 financialYearBeginningMonth);
 
         
this.savingsAccountTransactionRepository.save(acceptTransferTransaction);
-        this.savingAccountRepositoryWrapper.save(savingsAccount);
+        this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         postJournalEntries(savingsAccount, existingTransactionIds, 
existingReversedTransactionIds);
 
@@ -815,7 +817,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
         if (!dataValidationErrors.isEmpty()) { throw new 
PlatformApiDataValidationException(dataValidationErrors); }
 
         savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition);
-
+        this.savingsAccountChargeRepository.save(savingsAccountCharge);
         this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
 
         return new CommandProcessingResultBuilder() //
@@ -1054,7 +1056,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
         account.validateAccountBalanceDoesNotBecomeNegative("." + 
SavingsAccountTransactionType.PAY_CHARGE.getCode(),
                 depositAccountOnHoldTransactions);
 
-        this.savingAccountRepositoryWrapper.save(account);
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
 
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
     }
@@ -1245,7 +1247,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
         final Set<Long> existingReversedTransactionIds = new HashSet<>();
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         account.setSubStatusInactive(appuserRepository.fetchSystemUser());
-        this.savingAccountRepositoryWrapper.save(account);
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
     }
 
@@ -1265,7 +1267,7 @@ public class 
SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
         final Set<Long> existingReversedTransactionIds = new HashSet<>();
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         account.escheat(appuserRepository.fetchSystemUser());
-        this.savingAccountRepositoryWrapper.save(account);
+        this.savingAccountRepositoryWrapper.saveAndFlush(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds);
     }
        

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
index 32e763d..a63b49c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java
@@ -27,7 +27,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandProcessingService;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -133,11 +136,10 @@ public class 
SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataAccessException dve) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
 
         final StringBuilder errorCodeBuilder = new 
StringBuilder("error.msg.").append(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME);
 
-        final Throwable realCause = dve.getMostSpecificCause();
         if (realCause.getMessage().contains("sa_account_no_UNIQUE")) {
             final String accountNo = 
command.stringValueOfParameterNamed("accountNo");
             errorCodeBuilder.append(".duplicate.accountNo");
@@ -179,8 +181,12 @@ public class 
SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
                     .withSavingsId(savingsId) //
                     .build();
         } catch (final DataAccessException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -278,8 +284,12 @@ public class 
SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl
                     .with(changes) //
                     .build();
         } catch (final DataAccessException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return new CommandProcessingResult(Long.valueOf(-1));
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java
index a5d4f9c..7b0711e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java
@@ -28,6 +28,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.ApiParameterError;
@@ -37,7 +40,6 @@ import 
org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType;
-import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityType;
 import 
org.apache.fineract.infrastructure.entityaccess.service.FineractEntityAccessUtil;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.charge.domain.Charge;
@@ -85,9 +87,8 @@ public class 
SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataAccessException dae) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dae) {
 
-        final Throwable realCause = dae.getMostSpecificCause();
         if (realCause.getMessage().contains("sp_unq_name")) {
 
             final String name = command.stringValueOfParameterNamed("name");
@@ -105,7 +106,7 @@ public class 
SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi
                 "Unknown data integrity issue with resource.");
     }
 
-    private void logAsErrorUnexpectedDataIntegrityException(final 
DataAccessException dae) {
+    private void logAsErrorUnexpectedDataIntegrityException(final Exception 
dae) {
         this.logger.error(dae.getMessage(), dae);
     }
 
@@ -134,8 +135,12 @@ public class 
SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi
                     .withEntityId(product.getId()) //
                     .build();
         } catch (final DataAccessException e) {
-            handleDataIntegrityIssues(command, e);
+            handleDataIntegrityIssues(command, e.getMostSpecificCause(), e);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -189,8 +194,12 @@ public class 
SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi
                     .withEntityId(product.getId()) //
                     .with(changes).build();
         } catch (final DataAccessException e) {
-            handleDataIntegrityIssues(command, e);
+            handleDataIntegrityIssues(command, e.getMostSpecificCause(), e);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java
index 76d0432..30e0e20 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java
@@ -28,12 +28,12 @@ import javax.persistence.Entity;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_selfservice_beneficiaries_tpt", uniqueConstraints = { 
@UniqueConstraint(columnNames = {
                "name", "app_user_id", "is_active" }, name = "name") })
-public class SelfBeneficiariesTPT extends AbstractPersistable<Long> {
+public class SelfBeneficiariesTPT extends AbstractPersistableCustom<Long> {
 
        @Column(name = "app_user_id", nullable = false)
        private Long appUserId;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java
index 7467c43..0851268 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java
@@ -45,11 +45,11 @@ import 
org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
 import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
 import org.apache.fineract.portfolio.shareproducts.domain.ShareProduct;
 import org.apache.fineract.useradministration.domain.AppUser;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_share_account")
-public class ShareAccount extends AbstractPersistable<Long> {
+public class ShareAccount extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "client_id", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java
index 7b8a356..feed817 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java
@@ -28,18 +28,17 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
 import org.apache.fineract.portfolio.charge.domain.Charge;
 import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType;
 import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_share_account_charge")
-public class ShareAccountCharge extends AbstractPersistable<Long> {
+public class ShareAccountCharge extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "account_id", referencedColumnName = "id", nullable = 
false)
@@ -428,13 +427,4 @@ public class ShareAccountCharge extends 
AbstractPersistable<Long> {
                 .append(this.amount, rhs.amount) //
                 .isEquals();
     }
-
-    @Override
-    public int hashCode() {
-        return new HashCodeBuilder(3, 5) //
-                .append(getId()) //
-                .append(this.charge.getId()) //
-                .append(this.amount)//
-                .toHashCode();
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java
index d9843eb..d52d777 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java
@@ -26,12 +26,12 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 
 @Entity
 @Table(name = "m_share_account_charge_paid_by")
-public class ShareAccountChargePaidBy extends AbstractPersistable<Long>{
+public class ShareAccountChargePaidBy extends AbstractPersistableCustom<Long>{
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "share_transaction_id", referencedColumnName = "id", 
nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java
index 40821cb..5a3d5df 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java
@@ -24,11 +24,11 @@ import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_share_account_dividend_details")
-public class ShareAccountDividendDetails extends AbstractPersistable<Long> {
+public class ShareAccountDividendDetails extends 
AbstractPersistableCustom<Long> {
 
     @Column(name = "account_id", nullable = false)
     private Long shareAccountId;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java
index 186b189..9910421 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java
@@ -34,11 +34,11 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_share_account_transactions")
-public class ShareAccountTransaction extends AbstractPersistable<Long> {
+public class ShareAccountTransaction extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "account_id", referencedColumnName = "id", nullable = 
false)
@@ -73,7 +73,7 @@ public class ShareAccountTransaction extends 
AbstractPersistable<Long> {
     private boolean active = true ;
     
     @OneToMany(cascade = CascadeType.ALL, mappedBy = 
"shareAccountTransaction", orphanRemoval = true, fetch=FetchType.EAGER)
-    private final Set<ShareAccountChargePaidBy> shareAccountChargesPaid = new 
HashSet<>();
+    private Set<ShareAccountChargePaidBy> shareAccountChargesPaid = new 
HashSet<>();
     
     protected ShareAccountTransaction() {
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java
index 11daee9..80812af 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java
@@ -944,6 +944,7 @@ public class ShareAccountDataSerializer {
         JsonElement element = jsonCommand.parsedJson();
         LocalDate closedDate = 
this.fromApiJsonHelper.extractLocalDateNamed(ShareAccountApiConstants.closeddate_paramname,
 element);
         
baseDataValidator.reset().parameter(ShareAccountApiConstants.approveddate_paramname).value(closedDate).notNull();
+        if (!dataValidationErrors.isEmpty()) { throw new 
PlatformApiDataValidationException(dataValidationErrors); }
         boolean isTransactionBeforeExistingTransactions = false ;
         Set<ShareAccountTransaction> transactions = 
account.getShareAccountTransactions() ;
         for(ShareAccountTransaction transaction: transactions) {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java
index 4bf7a85..7a2a422 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java
@@ -27,7 +27,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper;
@@ -35,6 +38,7 @@ import 
org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccou
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
+import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
@@ -102,8 +106,12 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .withEntityId(account.getId()) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(jsonCommand, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -196,8 +204,12 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(jsonCommand, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -226,7 +238,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -267,7 +279,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -301,7 +313,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -338,7 +350,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -360,7 +372,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -397,7 +409,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -426,7 +438,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -461,7 +473,7 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -495,12 +507,13 @@ public class 
ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA
                     .with(changes) //
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
         }
     }
 
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataIntegrityViolationException dve) {
-
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
+        throw new 
PlatformDataIntegrityException("error.msg.shareaccount.unknown.data.integrity.issue",
+                "Unknown data integrity issue with resource.");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java
index 14cc73a..a06427f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java
@@ -81,7 +81,7 @@ public class ShareProduct extends 
AbstractAuditableCustom<AppUser, Long> {
     @Column(name = "issued_shares", nullable = false)
     private Long totalSharesIssued;
 
-    @Column(name = "totalsubscribed_shares", nullable = false)
+    @Column(name = "totalsubscribed_shares", nullable = true)
     private Long totalSubscribedShares;
     
     @Column(name = "unit_price", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java
index 6042149..2ca7e66 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java
@@ -29,11 +29,11 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_share_product_market_price")
-public class ShareProductMarketPrice extends AbstractPersistable<Long> {
+public class ShareProductMarketPrice extends AbstractPersistableCustom<Long> {
     
     @ManyToOne(optional = false)
     @JoinColumn(name = "product_id", referencedColumnName = "id", nullable = 
false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java
index e9aaac7..2a310a2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java
@@ -21,6 +21,9 @@ package org.apache.fineract.portfolio.shareproducts.service;
 import java.math.BigDecimal;
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -78,9 +81,13 @@ public class 
ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP
                     .withCommandId(jsonCommand.commandId()) //
                     .withEntityId(product.getId()) //
                     .build();
-        } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+        }catch (DataIntegrityViolationException dve) {
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch (PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(jsonCommand, throwable, dve);
+               return CommandProcessingResult.empty();
         }
 
     }
@@ -105,9 +112,13 @@ public class 
ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP
                     .withEntityId(productId) //
                     .with(changes) //
                     .build();
-        } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+        }catch (DataIntegrityViolationException dve) {
+            handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch (PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleDataIntegrityIssues(jsonCommand, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -135,7 +146,7 @@ public class 
ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP
                     .withSubEntityId(dividendPayOutDetails.getId())//
                     .build();
         } catch (DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(jsonCommand, dve);
+            handleDataIntegrityIssues(dve);
             return CommandProcessingResult.empty();
         }
     }
@@ -175,16 +186,22 @@ public class 
ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP
         }
     }
 
-    private void handleDataIntegrityIssues(final 
DataIntegrityViolationException dve) {
-        final Throwable realCause = dve.getMostSpecificCause();
-        throw new 
PlatformDataIntegrityException("error.msg.glClosure.unknown.data.integrity.issue",
-                "Unknown data integrity issue with resource GL Closure: " + 
realCause.getMessage());
+    private void handleDataIntegrityIssues(final Exception e) {
+        throw new 
PlatformDataIntegrityException("error.msg.shareproduct.unknown.data.integrity.issue",
+                "Unknown data integrity issue with resource.");
     }
 
-    private void handleDataIntegrityIssues(@SuppressWarnings("unused") final 
JsonCommand command, final DataIntegrityViolationException dve) {
-        final Throwable realCause = dve.getMostSpecificCause();
-        throw new 
PlatformDataIntegrityException("error.msg.glClosure.unknown.data.integrity.issue",
-                "Unknown data integrity issue with resource GL Closure: " + 
realCause.getMessage());
+    
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
+
+        if (realCause.getMessage().contains("'name'")) {
+            final String name = 
command.stringValueOfParameterNamed(ShareProductApiConstants.name_paramname);
+            throw new 
PlatformDataIntegrityException("error.msg.shareproduct.duplicate.name", "Share 
Product with name `" + name
+                    + "` already exists", "name", name);
+        } 
+
+        throw new 
PlatformDataIntegrityException("error.msg.shareproduct.unknown.data.integrity.issue",
+                "Unknown data integrity issue with resource.");
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java
index 5e7b4a2..8a3191b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java
@@ -18,13 +18,13 @@
  */
 package org.apache.fineract.spm.domain;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 
 @Entity
 @Table(name = "m_survey_components")
-public class Component extends AbstractPersistable<Long> {
+public class Component extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "survey_id")

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java
 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java
index 1448798..26e4ad9 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java
@@ -18,13 +18,13 @@
  */
 package org.apache.fineract.spm.domain;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 
 @Entity
 @Table(name = "m_survey_lookup_tables")
-public class LookupTable extends AbstractPersistable<Long> {
+public class LookupTable extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "survey_id")

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java
index 861a5c8..c33d356 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java
@@ -18,20 +18,20 @@
  */
 package org.apache.fineract.spm.domain;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 import java.util.List;
 
 @Entity
 @Table(name = "m_survey_questions")
-public class Question extends AbstractPersistable<Long> {
+public class Question extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "survey_id")
     private Survey survey;
 
-    @OneToMany(mappedBy = "question", fetch = FetchType.LAZY, cascade = 
CascadeType.ALL)
+    @OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = 
CascadeType.ALL)
     @OrderBy("sequenceNo")
     private List<Response> responses;
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java
index 1b742d8..3c9fe33 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java
@@ -18,13 +18,13 @@
  */
 package org.apache.fineract.spm.domain;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 
 @Entity
 @Table(name = "m_survey_responses")
-public class Response extends AbstractPersistable<Long> {
+public class Response extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "question_id")

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java
index 40a9268..0588ca6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java
@@ -20,14 +20,14 @@ package org.apache.fineract.spm.domain;
 
 import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.useradministration.domain.AppUser;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 import java.util.Date;
 
 @Entity
 @Table(name = "m_survey_scorecards")
-public class Scorecard extends AbstractPersistable<Long> {
+public class Scorecard extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "survey_id")

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java 
b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java
index 8728cdd..bd68905 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java
@@ -18,7 +18,7 @@
  */
 package org.apache.fineract.spm.domain;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 import java.util.Date;
@@ -26,13 +26,13 @@ import java.util.List;
 
 @Entity
 @Table(name = "m_surveys")
-public class Survey extends AbstractPersistable<Long> {
+public class Survey extends AbstractPersistableCustom<Long> {
 
-    @OneToMany(mappedBy = "survey", fetch = FetchType.LAZY, cascade = 
CascadeType.ALL)
+    @OneToMany(mappedBy = "survey", fetch = FetchType.EAGER, cascade = 
CascadeType.ALL)
     @OrderBy("sequenceNo")
     private List<Component> components;
 
-    @OneToMany(mappedBy = "survey", fetch = FetchType.LAZY, cascade = 
CascadeType.ALL)
+    @OneToMany(mappedBy = "survey", fetch = FetchType.EAGER, cascade = 
CascadeType.ALL)
     @OrderBy("sequenceNo")
     private List<Question> questions;
 


Reply via email to