http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
index 1377e47..ba12c41 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
@@ -20,6 +20,9 @@ package org.apache.fineract.organisation.office.service;
 
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
@@ -105,8 +108,12 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
                     .withOfficeId(office.getId()) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleOfficeDataIntegrityIssues(command, dve);
+            handleOfficeDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleOfficeDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -148,8 +155,12 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
                     .with(changes) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleOfficeDataIntegrityIssues(command, dve);
+            handleOfficeDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleOfficeDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -211,9 +222,8 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleOfficeDataIntegrityIssues(final JsonCommand command, 
final DataIntegrityViolationException dve) {
+    private void handleOfficeDataIntegrityIssues(final JsonCommand command, 
final Throwable realCause, final Exception dve) {
 
-        final Throwable realCause = dve.getMostSpecificCause();
         if (realCause.getMessage().contains("externalid_org")) {
             final String externalId = 
command.stringValueOfParameterNamed("externalId");
             throw new 
PlatformDataIntegrityException("error.msg.office.duplicate.externalId", "Office 
with externalId `" + externalId

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/LoanProductProvisionCriteria.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/LoanProductProvisionCriteria.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/LoanProductProvisionCriteria.java
index 0ddf762..042c401 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/LoanProductProvisionCriteria.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/LoanProductProvisionCriteria.java
@@ -24,12 +24,12 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_loanproduct_provisioning_mapping", uniqueConstraints = { 
@UniqueConstraint(columnNames = { "product_id" }, name = "product_id") })
-public class LoanProductProvisionCriteria extends AbstractPersistable<Long> {
+public class LoanProductProvisionCriteria extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "criteria_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/organisation/provisioning/domain/ProvisioningCategory.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCategory.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCategory.java
index 7492d12..2c79dd8 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCategory.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCategory.java
@@ -27,11 +27,11 @@ import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_provision_category", uniqueConstraints = { 
@UniqueConstraint(columnNames = { "category_name" }, name = "category_name") })
-public class ProvisioningCategory extends AbstractPersistable<Long> {
+public class ProvisioningCategory extends AbstractPersistableCustom<Long> {
 
     @Column(name = "category_name", nullable = false, unique = true)
     private String categoryName;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java
index 320b3cc..e3de373 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java
@@ -116,7 +116,7 @@ public class ProvisioningCriteria extends 
AbstractAuditableCustom<AppUser, Long>
     
     public void update(ProvisioningCriteriaDefinitionData data, GLAccount 
liability, GLAccount expense) {
         for(ProvisioningCriteriaDefinition def: 
provisioningCriteriaDefinition) {
-            if(data.getId() == def.getId()) {
+            if(data.getId().equals(def.getId())) {
                 def.update(data.getMinAge(), data.getMaxAge(), 
data.getProvisioningPercentage(), liability, expense) ;
                 break ;
             }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteriaDefinition.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteriaDefinition.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteriaDefinition.java
index 01eb54b..28e0657 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteriaDefinition.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteriaDefinition.java
@@ -20,6 +20,7 @@ package org.apache.fineract.organisation.provisioning.domain;
 
 import java.math.BigDecimal;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.JoinColumn;
@@ -27,11 +28,11 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.fineract.accounting.glaccount.domain.GLAccount;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_provisioning_criteria_definition")
-public class ProvisioningCriteriaDefinition extends AbstractPersistable<Long> {
+public class ProvisioningCriteriaDefinition extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "criteria_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/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java
index 91dc24f..8f79236 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java
@@ -20,6 +20,9 @@ package org.apache.fineract.organisation.provisioning.service;
 
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
@@ -65,8 +68,12 @@ public class 
ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl implement
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(provisioningCategory.getId())
                     .build();
         } catch (final DataIntegrityViolationException 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();
         }
     }
 
@@ -96,8 +103,12 @@ public class 
ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl implement
             }
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(categoryId).with(changes).build();
         } catch (final DataIntegrityViolationException 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();
         }
     }
 
@@ -110,9 +121,8 @@ public class 
ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl implement
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataIntegrityViolationException dve) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
 
-        final Throwable realCause = dve.getMostSpecificCause();
         if (realCause.getMessage().contains("category_name")) {
             final String name = 
command.stringValueOfParameterNamed("category_name");
             throw new 
PlatformDataIntegrityException("error.msg.provisioning.duplicate.categoryname", 
"Provisioning Cateory with name `"

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java
index 0c7f599..1be4d72 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java
@@ -23,6 +23,9 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.fineract.accounting.glaccount.domain.GLAccount;
 import org.apache.fineract.accounting.glaccount.domain.GLAccountRepository;
 import 
org.apache.fineract.accounting.provisioning.service.ProvisioningEntriesReadPlatformService;
@@ -84,8 +87,12 @@ public class 
ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl implement
             this.provisioningCriteriaRepository.save(provisioningCriteria);
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(provisioningCriteria.getId()).build();
         } catch (final DataIntegrityViolationException 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();
         }
     }
 
@@ -114,12 +121,16 @@ public class 
ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl implement
             final Map<String, Object> changes = 
provisioningCriteria.update(command, products) ;
             if(!changes.isEmpty()) {
                 updateProvisioningCriteriaDefinitions(provisioningCriteria, 
command) ;
-                provisioningCriteriaRepository.save(provisioningCriteria) ;    
+                
provisioningCriteriaRepository.saveAndFlush(provisioningCriteria) ;    
             }
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(provisioningCriteria.getId()).build();
 
        } catch (final DataIntegrityViolationException 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();
         }
     }
 
@@ -153,9 +164,7 @@ public class 
ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl implement
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataIntegrityViolationException dve) {
-
-        final Throwable realCause = dve.getMostSpecificCause();
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
         if (realCause.getMessage().contains("criteria_name")) {
             final String name = 
command.stringValueOfParameterNamed("criteria_name");
             throw new 
PlatformDataIntegrityException("error.msg.provisioning.duplicate.criterianame", 
"Provisioning Criteria with name `"

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java
index d616ab4..64f6f90 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java
@@ -22,21 +22,29 @@ import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.UniqueConstraint;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.infrastructure.documentmanagement.domain.Image;
 import org.apache.fineract.organisation.office.domain.Office;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_staff", uniqueConstraints = { @UniqueConstraint(columnNames = 
{ "display_name" }, name = "display_name"),
         @UniqueConstraint(columnNames = { "external_id" }, name = 
"external_id_UNIQUE"),
         @UniqueConstraint(columnNames = { "mobile_no" }, name = 
"mobile_no_UNIQUE") })
-public class Staff extends AbstractPersistable<Long> {
+public class Staff extends AbstractPersistableCustom<Long> {
 
     @Column(name = "firstname", length = 50)
     private String firstname;
@@ -57,7 +65,7 @@ public class Staff extends AbstractPersistable<Long> {
     @JoinColumn(name = "office_id", nullable = false)
     private Office office;
 
-    @Column(name = "is_loan_officer ", nullable = false)
+    @Column(name = "is_loan_officer", nullable = false)
     private boolean loanOfficer;
 
     @Column(name = "organisational_role_enum", nullable = true)
@@ -66,7 +74,7 @@ public class Staff extends AbstractPersistable<Long> {
     @Column(name = "is_active", nullable = false)
     private boolean active;
 
-    @Column(name = "joining_date", nullable = false)
+    @Column(name = "joining_date", nullable = true)
     @Temporal(TemporalType.DATE)
     private Date joiningDate;
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
index b10dd12..a46e90d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
@@ -20,7 +20,10 @@ package org.apache.fineract.organisation.staff.service;
 
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
+
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
@@ -74,8 +77,12 @@ public class StaffWritePlatformServiceJpaRepositoryImpl 
implements StaffWritePla
                     .withEntityId(staff.getId()).withOfficeId(officeId) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleStaffDataIntegrityIssues(command, dve);
+            handleStaffDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleStaffDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -104,8 +111,12 @@ public class StaffWritePlatformServiceJpaRepositoryImpl 
implements StaffWritePla
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(staffId)
                     
.withOfficeId(staffForUpdate.officeId()).with(changesOnly).build();
         } catch (final DataIntegrityViolationException dve) {
-            handleStaffDataIntegrityIssues(command, dve);
+            handleStaffDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleStaffDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -113,8 +124,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl 
implements StaffWritePla
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleStaffDataIntegrityIssues(final JsonCommand command, 
final DataIntegrityViolationException dve) {
-        final Throwable realCause = dve.getMostSpecificCause();
+    private void handleStaffDataIntegrityIssues(final JsonCommand command, 
final Throwable realCause, final Exception dve) {
 
         if (realCause.getMessage().contains("external_id")) {
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Cashier.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Cashier.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Cashier.java
index cb2c16d..1d5922f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Cashier.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Cashier.java
@@ -22,7 +22,7 @@ import 
org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.organisation.office.domain.Office;
 import org.apache.fineract.organisation.staff.domain.Staff;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 import java.util.Date;
@@ -40,7 +40,7 @@ import java.util.Map;
 @Entity
 @Table(name = "m_cashiers", uniqueConstraints = { @UniqueConstraint(name = 
"ux_cashiers_staff_teller", columnNames = { "staff_id",
         "teller_id" }) })
-public class Cashier extends AbstractPersistable<Long> {
+public class Cashier extends AbstractPersistableCustom<Long> {
 
     // ManyToOne(fetch = FetchType.LAZY)
     // JoinColumn(name = "office_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/CashierTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/CashierTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/CashierTransaction.java
index 28ff20c..65af4dd 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/CashierTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/CashierTransaction.java
@@ -22,7 +22,7 @@ package org.apache.fineract.organisation.teller.domain;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.organisation.office.domain.Office;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.*;
 
@@ -33,7 +33,7 @@ import java.util.Map;
 
 @Entity
 @Table(name = "m_cashier_transactions")
-public class CashierTransaction extends AbstractPersistable<Long> {
+public class CashierTransaction extends AbstractPersistableCustom<Long> {
 
        @Transient
     private Office office;
@@ -58,10 +58,10 @@ public class CashierTransaction extends 
AbstractPersistable<Long> {
     @Column(name = "txn_note", nullable = true)
     private String txnNote;
     
-    @Column(name = "entity_type", nullable = false)
+    @Column(name = "entity_type", nullable = true)
     private String entityType;
     
-    @Column(name = "entity_id", nullable = false)
+    @Column(name = "entity_id", nullable = true)
     private Long entityId;
 
     @Temporal(TemporalType.TIMESTAMP)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Teller.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Teller.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Teller.java
index ec3d0f3..b1fc196 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Teller.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/Teller.java
@@ -39,24 +39,24 @@ import 
org.apache.fineract.accounting.glaccount.domain.GLAccount;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.organisation.office.domain.Office;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_tellers", uniqueConstraints = {
         @UniqueConstraint(name = "ux_tellers_name", columnNames = {"name"})
 })
-public class Teller extends AbstractPersistable<Long> {
+public class Teller extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "office_id", nullable = false)
     private Office office;
 
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "debit_account_id", nullable = false)
+    @ManyToOne(fetch = FetchType.EAGER)
+    @JoinColumn(name = "debit_account_id", nullable = true)
     private GLAccount debitAccount;
 
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "credit_account_id", nullable = false)
+    @ManyToOne(fetch = FetchType.EAGER)
+    @JoinColumn(name = "credit_account_id", nullable = true)
     private GLAccount creditAccount;
 
     @Column(name = "name", nullable = false, length = 100)
@@ -66,11 +66,11 @@ public class Teller extends AbstractPersistable<Long> {
     private String description;
 
     @Temporal(TemporalType.TIMESTAMP)
-    @Column(name = "valid_from", nullable = false)
+    @Column(name = "valid_from", nullable = true)
     private Date startDate;
 
     @Temporal(TemporalType.TIMESTAMP)
-    @Column(name = "valid_to", nullable = false)
+    @Column(name = "valid_to", nullable = true)
     private Date endDate;
 
     @Column(name = "state", nullable = false)
@@ -79,9 +79,6 @@ public class Teller extends AbstractPersistable<Long> {
     @OneToMany(mappedBy = "teller", fetch = FetchType.LAZY)
     private Set<Cashier> cashiers;
 
-    @OneToMany(mappedBy = "teller", fetch = FetchType.LAZY)
-    private Set<TellerTransaction> tellerTransactions;
-
     public Teller() {
         super();
     }
@@ -287,11 +284,8 @@ public class Teller extends AbstractPersistable<Long> {
         this.cashiers = cashiers;
     }
 
-    public Set<TellerTransaction> getTransactions() {
-        return tellerTransactions;
-    }
-
-    public void setTransactions(Set<TellerTransaction> tellerTransactions) {
-        this.tellerTransactions = tellerTransactions;
-    }
+       public void initializeLazyCollections() {
+               this.office.getId();
+               this.cashiers.size();
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerRepositoryWrapper.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerRepositoryWrapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerRepositoryWrapper.java
index bb447bc..183bc3e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerRepositoryWrapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerRepositoryWrapper.java
@@ -21,6 +21,7 @@ package org.apache.fineract.organisation.teller.domain;
 import 
org.apache.fineract.organisation.teller.exception.TellerNotFoundException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class TellerRepositoryWrapper {
@@ -32,9 +33,23 @@ public class TellerRepositoryWrapper {
         this.repository = repository;
     }
 
+    @Transactional(readOnly=true)
     public Teller findOneWithNotFoundDetection(final Long id) {
         final Teller teller = this.repository.findOne(id);
         if (teller == null) { throw new TellerNotFoundException(id); }
+        teller.initializeLazyCollections();
         return teller;
     }
+    
+    public Teller save(final Teller teller) {
+       return this.repository.save(teller) ;
+    }
+    
+    public Teller saveAndFlush(final Teller teller) {
+       return this.repository.saveAndFlush(teller) ;
+    }
+    
+    public void delete(final Teller teller) {
+       this.repository.delete(teller);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerTransaction.java
index 1b4aea9..17be51c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/domain/TellerTransaction.java
@@ -20,14 +20,14 @@ package org.apache.fineract.organisation.teller.domain;
 
 import org.apache.fineract.organisation.office.domain.Office;
 import org.apache.fineract.portfolio.client.domain.Client;
-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_teller_transactions")
-public class TellerTransaction extends AbstractPersistable<Long> {
+public class TellerTransaction extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "office_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
index bbaad90..925fa11 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
@@ -21,6 +21,9 @@ package org.apache.fineract.organisation.teller.service;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.common.AccountingConstants.FINANCIAL_ACTIVITY;
 import 
org.apache.fineract.accounting.financialactivityaccount.domain.FinancialActivityAccount;
 import 
org.apache.fineract.accounting.financialactivityaccount.domain.FinancialActivityAccountRepositoryWrapper;
@@ -45,11 +48,9 @@ import 
org.apache.fineract.organisation.teller.domain.CashierTransaction;
 import 
org.apache.fineract.organisation.teller.domain.CashierTransactionRepository;
 import org.apache.fineract.organisation.teller.domain.CashierTxnType;
 import org.apache.fineract.organisation.teller.domain.Teller;
-import org.apache.fineract.organisation.teller.domain.TellerRepository;
 import org.apache.fineract.organisation.teller.domain.TellerRepositoryWrapper;
 import 
org.apache.fineract.organisation.teller.exception.CashierExistForTellerException;
 import 
org.apache.fineract.organisation.teller.exception.CashierNotFoundException;
-import 
org.apache.fineract.organisation.teller.exception.TellerNotFoundException;
 import 
org.apache.fineract.organisation.teller.serialization.TellerCommandFromApiJsonDeserializer;
 import org.apache.fineract.portfolio.client.domain.ClientTransaction;
 import org.apache.fineract.useradministration.domain.AppUser;
@@ -67,7 +68,6 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
 
     private final PlatformSecurityContext context;
     private final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer;
-    private final TellerRepository tellerRepository;
     private final TellerRepositoryWrapper tellerRepositoryWrapper;
     private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final StaffRepository staffRepository;
@@ -78,14 +78,13 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
 
     @Autowired
     public TellerWritePlatformServiceJpaImpl(final PlatformSecurityContext 
context,
-            final TellerCommandFromApiJsonDeserializer 
fromApiJsonDeserializer, final TellerRepository tellerRepository,
+            final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer,
             final TellerRepositoryWrapper tellerRepositoryWrapper, final 
OfficeRepositoryWrapper officeRepositoryWrapper,
             final StaffRepository staffRepository, CashierRepository 
cashierRepository, CashierTransactionRepository cashierTxnRepository,
             JournalEntryRepository glJournalEntryRepository,
             FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepositoryWrapper) {
         this.context = context;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
-        this.tellerRepository = tellerRepository;
         this.tellerRepositoryWrapper = tellerRepositoryWrapper;
         this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.staffRepository = staffRepository;
@@ -111,7 +110,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
             final Teller teller = Teller.fromJson(tellerOffice, command);
 
             // pre save to generate id for use in office hierarchy
-            this.tellerRepository.save(teller);
+            this.tellerRepositoryWrapper.save(teller);
 
             return new CommandProcessingResultBuilder() //
                     .withCommandId(command.commandId()) //
@@ -119,8 +118,12 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     .withOfficeId(teller.getOffice().getId()) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleTellerDataIntegrityIssues(command, dve);
+            handleTellerDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleTellerDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -140,7 +143,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
             final Map<String, Object> changes = teller.update(tellerOffice, 
command);
 
             if (!changes.isEmpty()) {
-                this.tellerRepository.saveAndFlush(teller);
+                this.tellerRepositoryWrapper.saveAndFlush(teller);
             }
 
             return new CommandProcessingResultBuilder() //
@@ -150,8 +153,12 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     .with(changes) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleTellerDataIntegrityIssues(command, dve);
+            handleTellerDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleTellerDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -163,15 +170,10 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
 
         final Long userOfficeId = currentUser.getOffice().getId();
         final Office userOffice = 
this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId);
-        final Teller tellerToReturn = this.tellerRepository.findOne(tellerId);
-        if (tellerToReturn != null) {
-            final Long tellerOfficeId = tellerToReturn.officeId();
-            if 
(userOffice.doesNotHaveAnOfficeInHierarchyWithId(tellerOfficeId)) { throw new 
NoAuthorizationException(
+        final Teller tellerToReturn = 
this.tellerRepositoryWrapper.findOneWithNotFoundDetection(tellerId);
+        final Long tellerOfficeId = tellerToReturn.officeId();
+        if (userOffice.doesNotHaveAnOfficeInHierarchyWithId(tellerOfficeId)) { 
throw new NoAuthorizationException(
                     "User does not have sufficient priviledges to act on the 
provided office."); }
-        } else {
-            throw new TellerNotFoundException(tellerId);
-        }
-
         return tellerToReturn;
     }
 
@@ -188,7 +190,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     .equalsIgnoreCase(tellerId.toString())) { throw new 
CashierExistForTellerException(tellerId); }
 
         }
-        tellerRepository.delete(teller);
+        tellerRepositoryWrapper.delete(teller);
         return new CommandProcessingResultBuilder() //
                 .withEntityId(teller.getId()) //
                 .build();
@@ -199,9 +201,8 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleTellerDataIntegrityIssues(final JsonCommand command, 
final DataIntegrityViolationException dve) {
+    private void handleTellerDataIntegrityIssues(final JsonCommand command, 
final Throwable realCause, final Exception dve) {
 
-        final Throwable realCause = dve.getMostSpecificCause();
         if (realCause.getMessage().contains("m_tellers_name_unq")) {
             final String name = command.stringValueOfParameterNamed("name");
             throw new 
PlatformDataIntegrityException("error.msg.teller.duplicate.name", "Teller with 
name `" + name + "` already exists",
@@ -223,8 +224,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
             Long minEndTime;
             String startTime = " ";
             String endTime = " ";
-            final Teller teller = this.tellerRepository.findOne(tellerId);
-            if (teller == null) { throw new TellerNotFoundException(tellerId); 
}
+            final Teller teller = 
this.tellerRepositoryWrapper.findOneWithNotFoundDetection(tellerId);
             final Office tellerOffice = teller.getOffice();
 
             final Long staffId = command.longValueOfParameterNamed("staffId");
@@ -262,8 +262,12 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     .withSubEntityId(cashier.getId()) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleTellerDataIntegrityIssues(command, dve);
+            handleTellerDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleTellerDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -298,8 +302,12 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     .with(changes) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleTellerDataIntegrityIssues(command, dve);
+            handleTellerDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleTellerDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -321,8 +329,12 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
             this.cashierRepository.delete(cashier);
 
         } catch (final DataIntegrityViolationException dve) {
-            handleTellerDataIntegrityIssues(command, dve);
+            handleTellerDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleTellerDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
 
         return new CommandProcessingResultBuilder() //
@@ -444,8 +456,12 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     .withSubEntityId(cashierTxn.getId()) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleTellerDataIntegrityIssues(command, dve);
+            handleTellerDataIntegrityIssues(command, 
dve.getMostSpecificCause(), dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+               handleTellerDataIntegrityIssues(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/organisation/workingdays/domain/WorkingDays.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java
index adeba4a..9562719 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java
@@ -20,7 +20,7 @@ package org.apache.fineract.organisation.workingdays.domain;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import 
org.apache.fineract.organisation.workingdays.api.WorkingDaysApiConstants;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -31,7 +31,7 @@ import java.util.Map;
 
 @Entity
 @Table(name = "m_working_days")
-public class WorkingDays extends AbstractPersistable<Long> {
+public class WorkingDays extends AbstractPersistableCustom<Long> {
 
     @Column(name = "recurrence", length = 100, nullable = true)
     private String recurrence;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociations.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociations.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociations.java
index 82574bb..0891397 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociations.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociations.java
@@ -26,11 +26,11 @@ import javax.persistence.Table;
 
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_portfolio_account_associations")
-public class AccountAssociations extends AbstractPersistable<Long> {
+public class AccountAssociations extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "loan_account_id", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociationsRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociationsRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociationsRepository.java
index 141a8bd..00266c4 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociationsRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountAssociationsRepository.java
@@ -26,9 +26,9 @@ import org.springframework.data.repository.query.Param;
 public interface AccountAssociationsRepository extends 
JpaRepository<AccountAssociations, Long>,
         JpaSpecificationExecutor<AccountAssociations> {
 
-    @Query("from AccountAssociations aa where aa.loanAccount.id= :loanId and 
aa.associationType = :associationType")
+    @Query("select aa from AccountAssociations aa where aa.loanAccount.id= 
:loanId and aa.associationType = :associationType")
     AccountAssociations findByLoanIdAndType(@Param("loanId") Long loanId, 
@Param("associationType") Integer accountAssociationType);
 
-    @Query("from AccountAssociations aa where aa.savingsAccount.id= :savingsId 
and aa.associationType = :associationType")
+    @Query("select aa from AccountAssociations aa where aa.savingsAccount.id= 
:savingsId and aa.associationType = :associationType")
     AccountAssociations findBySavingsIdAndType(@Param("savingsId") Long 
savingsId, @Param("associationType") Integer accountAssociationType);
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetails.java
index 3a19ce6..8ec66ca 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetails.java
@@ -35,11 +35,11 @@ import 
org.apache.fineract.organisation.office.domain.Office;
 import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_account_transfer_details")
-public class AccountTransferDetails extends AbstractPersistable<Long> {
+public class AccountTransferDetails extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "from_office_id", nullable = false)
@@ -77,9 +77,9 @@ public class AccountTransferDetails extends 
AbstractPersistable<Long> {
     private Integer transferType;
 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "accountTransferDetails", 
orphanRemoval = true, fetch=FetchType.EAGER)
-    private final List<AccountTransferTransaction> accountTransferTransactions 
= new ArrayList<>();
+    private List<AccountTransferTransaction> accountTransferTransactions = new 
ArrayList<>();
 
-    @OneToOne(mappedBy = "accountTransferDetails", cascade = CascadeType.ALL, 
optional = true, orphanRemoval = true, fetch = FetchType.LAZY)
+    @OneToOne(mappedBy = "accountTransferDetails", cascade = CascadeType.ALL, 
optional = true, orphanRemoval = true, fetch = FetchType.EAGER)
     private AccountTransferStandingInstruction 
accountTransferStandingInstruction;
 
     public static AccountTransferDetails savingsToSavingsTransfer(final Office 
fromOffice, final Client fromClient,

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java
index 8158cb8..e790c4c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java
@@ -29,15 +29,15 @@ import org.springframework.data.repository.query.Param;
 public interface AccountTransferRepository extends 
JpaRepository<AccountTransferTransaction, Long>,
         JpaSpecificationExecutor<AccountTransferTransaction> {
 
-    @Query("from AccountTransferTransaction att where 
att.accountTransferDetails.fromLoanAccount.id= :accountNumber and 
att.reversed=false")
+    @Query("select att from AccountTransferTransaction att where 
att.accountTransferDetails.fromLoanAccount.id= :accountNumber and 
att.reversed=false")
     List<AccountTransferTransaction> findByFromLoanId(@Param("accountNumber") 
Long accountNumber);
 
-    @Query("from AccountTransferTransaction att where 
(att.accountTransferDetails.fromLoanAccount.id= :accountNumber or 
att.accountTransferDetails.toLoanAccount.id=:accountNumber) and 
att.reversed=false order by att.id desc")
+    @Query("select att from AccountTransferTransaction att where 
(att.accountTransferDetails.fromLoanAccount.id= :accountNumber or 
att.accountTransferDetails.toLoanAccount.id=:accountNumber) and 
att.reversed=false order by att.id desc")
     List<AccountTransferTransaction> findAllByLoanId(@Param("accountNumber") 
Long accountNumber);
 
-    @Query("from AccountTransferTransaction att where 
att.toLoanTransaction.id= :loanTransactionId and att.reversed=false")
+    @Query("select att from AccountTransferTransaction att where 
att.toLoanTransaction.id= :loanTransactionId and att.reversed=false")
     AccountTransferTransaction 
findByToLoanTransactionId(@Param("loanTransactionId") Long loanTransactionId);
 
-    @Query("from AccountTransferTransaction att where 
att.fromLoanTransaction.id IN :loanTransactions and att.reversed=false")
+    @Query("select att from AccountTransferTransaction att where 
att.fromLoanTransaction.id IN :loanTransactions and att.reversed=false")
     List<AccountTransferTransaction> 
findByFromLoanTransactions(@Param("loanTransactions") Collection<Long> 
loanTransactions);
 }
\ 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/account/domain/AccountTransferStandingInstruction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferStandingInstruction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferStandingInstruction.java
index 4249338..2335789 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferStandingInstruction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferStandingInstruction.java
@@ -54,11 +54,11 @@ import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati
 import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
 import org.joda.time.LocalDate;
 import org.joda.time.MonthDay;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_account_transfer_standing_instructions", uniqueConstraints = 
{ @UniqueConstraint(columnNames = { "name" }, name = "name") })
-public class AccountTransferStandingInstruction extends 
AbstractPersistable<Long> {
+public class AccountTransferStandingInstruction extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "account_transfer_details_id", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferTransaction.java
index bcec4f4..d5bbd30 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferTransaction.java
@@ -35,11 +35,11 @@ import 
org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_account_transfer_transaction")
-public class AccountTransferTransaction extends AbstractPersistable<Long> {
+public class AccountTransferTransaction extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "account_transfer_details_id", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/Address.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/Address.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/Address.java
index 6143a5b..85c39a2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/Address.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/Address.java
@@ -33,17 +33,17 @@ import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.codes.domain.CodeValue;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.client.domain.ClientAddress;
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 import com.google.gson.JsonObject;
 
 @Entity
 @Table(name = "m_address")
-public class Address extends AbstractPersistable<Long> {
+public class Address extends AbstractPersistableCustom<Long> {
 
        /*
         * @OneToMany(mappedBy = "address", cascade = CascadeType.ALL) private

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/FieldConfiguration.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/FieldConfiguration.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/FieldConfiguration.java
index 8afcb93..7353c7e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/FieldConfiguration.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/domain/FieldConfiguration.java
@@ -22,11 +22,11 @@ import javax.persistence.Entity;
 import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_field_configuration")
-public class FieldConfiguration extends AbstractPersistable<Long> {
+public class FieldConfiguration extends AbstractPersistableCustom<Long> {
 
        private String entity;
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java
index 93dc0bf..e9d2cf4 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java
@@ -29,11 +29,11 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_calendar_history")
-public class CalendarHistory extends AbstractPersistable<Long> {
+public class CalendarHistory extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "calendar_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/calendar/domain/CalendarInstance.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java
index 6ae6c60..b9ce4e3 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java
@@ -25,11 +25,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_calendar_instance")
-public class CalendarInstance extends AbstractPersistable<Long> {
+public class CalendarInstance extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(cascade = CascadeType.PERSIST)
     @JoinColumn(name = "calendar_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java
index 8fe3c24..8b1ea7e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java
@@ -44,13 +44,13 @@ public interface CalendarInstanceRepository extends 
JpaRepository<CalendarInstan
      */
     CalendarInstance findByEntityIdAndEntityTypeIdAndCalendarTypeId(Long 
entityId, Integer entityTypeId, Integer calendarTypeId);
 
-    @Query("from CalendarInstance ci where ci.entityId = :entityId and 
ci.entityTypeId = :entityTypeId")
+    @Query("select ci from CalendarInstance ci where ci.entityId = :entityId 
and ci.entityTypeId = :entityTypeId")
     CalendarInstance findCalendarInstaneByEntityId(@Param("entityId") Long 
entityId, @Param("entityTypeId") Integer entityTypeId);
 
     Collection<CalendarInstance> findByCalendarIdAndEntityTypeId(Long 
calendarId, Integer entityTypeId);
 
     /** Should use in clause, can I do it without creating a new class? **/
-    @Query("from CalendarInstance ci where ci.entityId in (select id from Loan 
loan where loan.client.id = :clientId and loan.group.id = :groupId and 
(loan.loanStatus = 100 or loan.loanStatus = 200 or loan.loanStatus = 300)) and 
ci.entityTypeId = 3")
+    @Query("select ci from CalendarInstance ci where ci.entityId in (select id 
from Loan loan where loan.client.id = :clientId and loan.group.id = :groupId 
and (loan.loanStatus = 100 or loan.loanStatus = 200 or loan.loanStatus = 300)) 
and ci.entityTypeId = 3")
     List<CalendarInstance> 
findCalendarInstancesForActiveLoansByGroupIdAndClientId(@Param("groupId") Long 
groupId,
             @Param("clientId") Long clientId);
     

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java
index 3e20582..19c46b3 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java
@@ -52,11 +52,11 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
 import org.apache.fineract.portfolio.tax.data.TaxGroupData;
 import org.apache.fineract.portfolio.tax.domain.TaxGroup;
 import org.joda.time.MonthDay;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_charge", uniqueConstraints = { @UniqueConstraint(columnNames 
= { "name" }, name = "name") })
-public class Charge extends AbstractPersistable<Long> {
+public class Charge extends AbstractPersistableCustom<Long> {
 
     @Column(name = "name", length = 100)
     private String name;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
index 3366a24..8d438cc 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
@@ -89,7 +89,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     public Collection<ChargeData> retrieveAllCharges() {
         final ChargeMapper rm = new ChargeMapper();
 
-        String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 ";
+        String sql = "select " + rm.chargeSchema() + " where 
c.is_deleted=false ";
 
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
@@ -102,7 +102,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     public Collection<ChargeData> retrieveAllChargesForCurrency(String 
currencyCode) {
         final ChargeMapper rm = new ChargeMapper();
 
-        String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 
and c.currency_code='" + currencyCode + "' ";
+        String sql = "select " + rm.chargeSchema() + " where 
c.is_deleted=false and c.currency_code='" + currencyCode + "' ";
 
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
@@ -116,10 +116,11 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         try {
             final ChargeMapper rm = new ChargeMapper();
 
-            String sql = "select " + rm.chargeSchema() + " where c.id = ? and 
c.is_deleted=0 ";
+            String sql = "select " + rm.chargeSchema() + " where c.id = ? and 
c.is_deleted=false ";
 
             sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
+            sql = sql + " ;" ;
             return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { 
chargeId });
         } catch (final EmptyResultDataAccessException e) {
             throw new ChargeNotFoundException(chargeId);
@@ -162,7 +163,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     public Collection<ChargeData> retrieveLoanProductCharges(final Long 
loanProductId) {
         final ChargeMapper rm = new ChargeMapper();
 
-        String sql = "select " + rm.loanProductChargeSchema() + " where 
c.is_deleted=0 and c.is_active=1 and plc.product_loan_id=? ";
+        String sql = "select " + rm.loanProductChargeSchema() + " where 
c.is_deleted=false and c.is_active=true and plc.product_loan_id=? ";
 
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
@@ -175,7 +176,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         final ChargeMapper rm = new ChargeMapper();
 
         String sql = "select " + rm.loanProductChargeSchema()
-                + " where c.is_deleted=0 and c.is_active=1 and 
plc.product_loan_id=? and c.charge_time_enum=? ";
+                + " where c.is_deleted=false and c.is_active=true and 
plc.product_loan_id=? and c.charge_time_enum=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
         return this.jdbcTemplate.query(sql, rm, new Object[] { loanProductId, 
chargeTime.getValue() });
@@ -186,7 +187,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         final ChargeMapper rm = new ChargeMapper();
         Object[] params = new Object[] { ChargeAppliesTo.LOAN.getValue() };
         String sql = "select " + rm.chargeSchema()
-                + " where c.is_deleted=0 and c.is_active=1 and c.is_penalty=0 
and c.charge_applies_to_enum=? ";
+                + " where c.is_deleted=false and c.is_active=true and 
c.is_penalty=false and c.charge_applies_to_enum=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
 
@@ -202,7 +203,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         paramMap.put("chargeAppliesTo", ChargeAppliesTo.LOAN.getValue());
         processChargeExclusionsForLoans(excludeChargeTimes, excludeClause);
         String sql = "select " + rm.chargeSchema() + " join m_loan la on 
la.currency_code = c.currency_code" + " where la.id=:loanId"
-                + " and c.is_deleted=0 and c.is_active=1 and 
c.charge_applies_to_enum=:chargeAppliesTo" + excludeClause + " ";
+                + " and c.is_deleted=false and c.is_active=true and 
c.charge_applies_to_enum=:chargeAppliesTo" + excludeClause + " ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
         return this.namedParameterJdbcTemplate.query(sql, paramMap, rm);
@@ -236,7 +237,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         paramMap.put("chargeAppliesTo", ChargeAppliesTo.LOAN.getValue());
         processChargeExclusionsForLoans(excludeChargeTimes, excludeClause);
         String sql = "select " + rm.chargeSchema() + " join m_product_loan lp 
on lp.currency_code = c.currency_code"
-                + " where lp.id=:productId" + " and c.is_deleted=0 and 
c.is_active=1 and c.charge_applies_to_enum=:chargeAppliesTo"
+                + " where lp.id=:productId" + " and c.is_deleted=false and 
c.is_active=true and c.charge_applies_to_enum=:chargeAppliesTo"
                 + excludeClause + " ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
@@ -249,7 +250,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         final ChargeMapper rm = new ChargeMapper();
 
         String sql = "select " + rm.chargeSchema()
-                + " where c.is_deleted=0 and c.is_active=1 and c.is_penalty=1 
and c.charge_applies_to_enum=? ";
+                + " where c.is_deleted=false and c.is_active=true and 
c.is_penalty=true and c.charge_applies_to_enum=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
         return this.jdbcTemplate.query(sql, rm, new Object[] { 
ChargeAppliesTo.LOAN.getValue() });
@@ -372,10 +373,10 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     public Collection<ChargeData> 
retrieveSavingsProductApplicableCharges(final boolean feeChargesOnly) {
         final ChargeMapper rm = new ChargeMapper();
 
-        String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 
and c.is_active=1 and c.charge_applies_to_enum=? ";
+        String sql = "select " + rm.chargeSchema() + " where 
c.is_deleted=false and c.is_active=true and c.charge_applies_to_enum=? ";
         if (feeChargesOnly) {
             sql = "select " + rm.chargeSchema()
-                    + " where c.is_deleted=0 and c.is_active=1 and 
c.is_penalty=0 and c.charge_applies_to_enum=? ";
+                    + " where c.is_deleted=false and c.is_active=true and 
c.is_penalty=false and c.charge_applies_to_enum=? ";
         }
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
@@ -388,7 +389,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         final ChargeMapper rm = new ChargeMapper();
 
         String sql = "select " + rm.chargeSchema()
-                + " where c.is_deleted=0 and c.is_active=1 and c.is_penalty=1 
and c.charge_applies_to_enum=? ";
+                + " where c.is_deleted=false and c.is_active=true and 
c.is_penalty=true and c.charge_applies_to_enum=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
         return this.jdbcTemplate.query(sql, rm, new Object[] { 
ChargeAppliesTo.SAVINGS.getValue() });
@@ -408,7 +409,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     public Collection<ChargeData> retrieveShareProductCharges(final Long 
shareProductId) {
         final ChargeMapper rm = new ChargeMapper();
 
-        String sql = "select " + rm.shareProductChargeSchema() + " where 
c.is_deleted=0 and c.is_active=1 and mspc.product_id=? ";
+        String sql = "select " + rm.shareProductChargeSchema() + " where 
c.is_deleted=false and c.is_active=true and mspc.product_id=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
         return this.jdbcTemplate.query(sql, rm, new Object[] { shareProductId 
});
@@ -420,7 +421,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         final ChargeMapper rm = new ChargeMapper();
 
         String sql = "select " + rm.chargeSchema() + " join m_savings_account 
sa on sa.currency_code = c.currency_code"
-                + " where c.is_deleted=0 and c.is_active=1 and 
c.charge_applies_to_enum=? " + " and sa.id = ?";
+                + " where c.is_deleted=false and c.is_active=true and 
c.charge_applies_to_enum=? " + " and sa.id = ?";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
 
         return this.jdbcTemplate.query(sql, rm, new Object[] { 
ChargeAppliesTo.SAVINGS.getValue(), savingsAccountId });
@@ -430,7 +431,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     @Override
     public Collection<ChargeData> retrieveAllChargesApplicableToClients() {
         final ChargeMapper rm = new ChargeMapper();
-        String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 
and c.is_active=1 and c.charge_applies_to_enum=? ";
+        String sql = "select " + rm.chargeSchema() + " where 
c.is_deleted=false and c.is_active=true and c.charge_applies_to_enum=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
 
@@ -440,7 +441,7 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     @Override
     public Collection<ChargeData> retrieveSharesApplicableCharges() {
         final ChargeMapper rm = new ChargeMapper();
-        String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 
and c.is_active=1 and c.charge_applies_to_enum=? ";
+        String sql = "select " + rm.chargeSchema() + " where 
c.is_deleted=false and c.is_active=true and c.charge_applies_to_enum=? ";
         sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
         sql += " order by c.name ";
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java
index fdc14cf..bfa2c5d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java
@@ -21,8 +21,10 @@ package org.apache.fineract.portfolio.charge.service;
 import java.util.Collection;
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
 import javax.sql.DataSource;
 
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.fineract.accounting.glaccount.domain.GLAccount;
 import 
org.apache.fineract.accounting.glaccount.domain.GLAccountRepositoryWrapper;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
@@ -31,7 +33,6 @@ import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuild
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
 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.api.ChargesApiConstants;
@@ -117,9 +118,13 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl 
implements ChargeWriteP
                     FineractEntityAccessType.OFFICE_ACCESS_TO_CHARGES, 
charge.getId());
 
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(charge.getId()).build();
-        } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(command, dve);
+        }catch (final DataIntegrityViolationException 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();
         }
     }
 
@@ -184,8 +189,12 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl 
implements ChargeWriteP
 
             return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(chargeId).with(changes).build();
         } catch (final DataIntegrityViolationException 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();
         }
     }
 
@@ -217,9 +226,8 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl 
implements ChargeWriteP
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataIntegrityViolationException dve) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
 
-        final Throwable realCause = dve.getMostSpecificCause();
         if (realCause.getMessage().contains("name")) {
             final String name = command.stringValueOfParameterNamed("name");
             throw new 
PlatformDataIntegrityException("error.msg.charge.duplicate.name", "Charge with 
name `" + name + "` already exists",

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
index a857b4b..0530452 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
@@ -57,12 +57,12 @@ import org.apache.fineract.portfolio.group.domain.Group;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormatter;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_client", uniqueConstraints = { @UniqueConstraint(columnNames 
= { "account_no" }, name = "account_no_UNIQUE"), //
         @UniqueConstraint(columnNames = { "mobile_no" }, name = 
"mobile_no_UNIQUE") })
-public final class Client extends AbstractPersistable<Long> {
+public final class Client extends AbstractPersistableCustom<Long> {
 
     @Column(name = "account_no", length = 20, unique = true, nullable = false)
     private String accountNumber;
@@ -153,7 +153,7 @@ public final class Client extends AbstractPersistable<Long> 
{
     @Temporal(TemporalType.DATE)
     private Date rejectionDate;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "rejectedon_userid", nullable = true)
     private AppUser rejectedBy;
 
@@ -165,7 +165,7 @@ public final class Client extends AbstractPersistable<Long> 
{
     @Temporal(TemporalType.DATE)
     private Date withdrawalDate;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "withdraw_on_userid", nullable = true)
     private AppUser withdrawnBy;
 
@@ -173,11 +173,11 @@ public final class Client extends 
AbstractPersistable<Long> {
     @Temporal(TemporalType.DATE)
     private Date reactivateDate;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "reactivated_on_userid", nullable = true)
     private AppUser reactivatedBy;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "closedon_userid", nullable = true)
     private AppUser closedBy;
 
@@ -185,7 +185,7 @@ public final class Client extends AbstractPersistable<Long> 
{
     @Temporal(TemporalType.DATE)
     private Date submittedOnDate;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "submittedon_userid", nullable = true)
     private AppUser submittedBy;
 
@@ -193,11 +193,11 @@ public final class Client extends 
AbstractPersistable<Long> {
     @Temporal(TemporalType.DATE)
     private Date updatedOnDate;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "updated_by", nullable = true)
     private AppUser updatedBy;
 
-    @ManyToOne(optional = true)
+    @ManyToOne(optional = true, fetch=FetchType.LAZY)
     @JoinColumn(name = "activatedon_userid", nullable = true)
     private AppUser activatedBy;
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
index a9624b5..5eff173 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
@@ -25,12 +25,12 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.codes.domain.CodeValue;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.address.domain.Address;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_client_address")
-public class ClientAddress extends AbstractPersistable<Long> {
+public class ClientAddress extends AbstractPersistableCustom<Long> {
 
        @ManyToOne
        private Client client;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientCharge.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientCharge.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientCharge.java
index 1410c5f..2374336 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientCharge.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientCharge.java
@@ -39,11 +39,11 @@ import 
org.apache.fineract.portfolio.charge.domain.ChargeCalculationType;
 import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
 import org.apache.fineract.portfolio.client.api.ClientApiConstants;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_client_charge")
-public class ClientCharge extends AbstractPersistable<Long> {
+public class ClientCharge extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "client_id", referencedColumnName = "id", nullable = 
false)


Reply via email to