title: org.hibernate.type.SerializationException: could not serialize is thrown while trying to save data to postgresl table
body: <p>I am getting a spring jpa exception while trying to save the itemLocations field into the table.
      package com.tgt.scmd.inbound.domain;</p>
  
  <pre><code>import java.io.Serializable;
  import java.sql.Timestamp;
  import java.util.Arrays;
  
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.SequenceGenerator;
  import javax.persistence.Table;
  
  import org.hibernate.annotations.CreationTimestamp;
  import org.hibernate.annotations.UpdateTimestamp;
  
  import com.tgt.scmd.inbound.utils.RequestStatus;
  @Entity
  @Table(name = "breakpack_authorization_details")
  public class SupplyChainBreakPackAuth implements Serializable{
  
      /**
       * 
       */
      private static final long serialVersionUID = -5688043643278441710L;
  
      @Id
      @SequenceGenerator(name = "break_pack_auth_seq", sequenceName = "break_pack_auth_seq", allocationSize = 1)
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "break_pack_auth_seq")
      private int id;
  
      private ItemLocations[] itemLocations;
  
      @Column(updatable = false)
      @CreationTimestamp
      private Timestamp requestedDate;
  
      private String requestReason;
  
      private String requestor;
  
      private String department;
  
      private String itemStatus;
  
      private String reasonForFailure;
  
      private String approversReason;
  
      private String approver;
  
      private String assortmentAnalysisDeptId;
  
      private String assortmentAnalysisDescription;
  
      private RequestStatus requestStatus;
  
      @UpdateTimestamp
      private Timestamp modifiedDate;
  
  
      public Integer getId() {
          return id;
      }
      public void setId(int id) {
          this.id = id;
      }
  
      public ItemLocations[] getItemLocations() {
          return itemLocations;
      }
      public void setItemLocations(ItemLocations[] itemLocations) {
          this.itemLocations = itemLocations;
      }
      public String getApprover() {
          return approver;
      }
  
      public void setApprover(String approver) {
          this.approver = approver;
      }
  
      public RequestStatus getRequestStatus() {
          return requestStatus;
      }
  
      public void setRequestStatus(RequestStatus requestStatus) {
          this.requestStatus = requestStatus;
      }
  
      public Timestamp getRequestedDate() {
          return requestedDate;
      }
  
      public void setRequestedDate(Timestamp requestedDate) {
          this.requestedDate = requestedDate;
      }
  
      public String getRequestReason() {
          return requestReason;
      }
  
      public void setRequestReason(String requestReason) {
          this.requestReason = requestReason;
      }
  
      public String getRequestor() {
          return requestor;
      }
  
      public void setRequestor(String requestor) {
          this.requestor = requestor;
      }
  
      public String getDepartment() {
          return department;
      }
  
      public void setDepartment(String department) {
          this.department = department;
      }
  
      public String getItemStatus() {
          return itemStatus;
      }
  
      public void setItemStatus(String itemStatus) {
          this.itemStatus = itemStatus;
      }
  
      public String getReasonForFailure() {
          return reasonForFailure;
      }
  
      public void setReasonForFailure(String reasonForFailure) {
          this.reasonForFailure = reasonForFailure;
      }
  
      public String getApproversReason() {
          return approversReason;
      }
  
      public void setApproversReason(String approversReason) {
          this.approversReason = approversReason;
      }
  
      public String getAssortmentAnalysisDeptId() {
          return assortmentAnalysisDeptId;
      }
  
      public void setAssortmentAnalysisDeptId(String assortmentAnalysisDeptId) {
          this.assortmentAnalysisDeptId = assortmentAnalysisDeptId;
      }
  
      public String getAssortmentAnalysisDescription() {
          return assortmentAnalysisDescription;
      }
  
      public void setAssortmentAnalysisDescription(
              String assortmentAnalysisDescription) {
          this.assortmentAnalysisDescription = assortmentAnalysisDescription;
      }
  
      public Timestamp getModifiedDate() {
          return modifiedDate;
      }
      public void setModifiedDate(Timestamp modifiedDate) {
          this.modifiedDate = modifiedDate;
      }
  
  
      @Override
      public int hashCode() {
          final int prime = 31;
          int result = 1;
          result = prime * result
                  + ((approver == null) ? 0 : approver.hashCode());
          result = prime * result
                  + ((approversReason == null) ? 0 : approversReason.hashCode());
          result = prime
                  * result
                  + ((assortmentAnalysisDeptId == null) ? 0
                          : assortmentAnalysisDeptId.hashCode());
          result = prime
                  * result
                  + ((assortmentAnalysisDescription == null) ? 0
                          : assortmentAnalysisDescription.hashCode());
          result = prime * result
                  + ((department == null) ? 0 : department.hashCode());
          result = prime * result + id;
          result = prime * result
                  + ((itemLocations == null) ? 0 : itemLocations.hashCode());
          result = prime * result
                  + ((itemStatus == null) ? 0 : itemStatus.hashCode());
          result = prime * result
                  + ((modifiedDate == null) ? 0 : modifiedDate.hashCode());
          result = prime
                  * result
                  + ((reasonForFailure == null) ? 0 : reasonForFailure.hashCode());
          result = prime * result
                  + ((requestReason == null) ? 0 : requestReason.hashCode());
          result = prime * result
                  + ((requestStatus == null) ? 0 : requestStatus.hashCode());
          result = prime * result
                  + ((requestedDate == null) ? 0 : requestedDate.hashCode());
          result = prime * result
                  + ((requestor == null) ? 0 : requestor.hashCode());
          return result;
      }
      @Override
      public boolean equals(Object obj) {
          if (this == obj)
              return true;
          if (obj == null)
              return false;
          if (getClass() != obj.getClass())
              return false;
          SupplyChainBreakPackAuth other = (SupplyChainBreakPackAuth) obj;
          if (approver == null) {
              if (other.approver != null)
                  return false;
          } else if (!approver.equals(other.approver))
              return false;
          if (approversReason == null) {
              if (other.approversReason != null)
                  return false;
          } else if (!approversReason.equals(other.approversReason))
              return false;
          if (assortmentAnalysisDeptId == null) {
              if (other.assortmentAnalysisDeptId != null)
                  return false;
          } else if (!assortmentAnalysisDeptId
                  .equals(other.assortmentAnalysisDeptId))
              return false;
          if (assortmentAnalysisDescription == null) {
              if (other.assortmentAnalysisDescription != null)
                  return false;
          } else if (!assortmentAnalysisDescription
                  .equals(other.assortmentAnalysisDescription))
              return false;
          if (department == null) {
              if (other.department != null)
                  return false;
          } else if (!department.equals(other.department))
              return false;
          if (id != other.id)
              return false;
          if (itemLocations == null) {
              if (other.itemLocations != null)
                  return false;
          } else if (!itemLocations.equals(other.itemLocations))
              return false;
          if (itemStatus == null) {
              if (other.itemStatus != null)
                  return false;
          } else if (!itemStatus.equals(other.itemStatus))
              return false;
          if (modifiedDate == null) {
              if (other.modifiedDate != null)
                  return false;
          } else if (!modifiedDate.equals(other.modifiedDate))
              return false;
          if (reasonForFailure == null) {
              if (other.reasonForFailure != null)
                  return false;
          } else if (!reasonForFailure.equals(other.reasonForFailure))
              return false;
          if (requestReason == null) {
              if (other.requestReason != null)
                  return false;
          } else if (!requestReason.equals(other.requestReason))
              return false;
          if (requestStatus != other.requestStatus)
              return false;
          if (requestedDate == null) {
              if (other.requestedDate != null)
                  return false;
          } else if (!requestedDate.equals(other.requestedDate))
              return false;
          if (requestor == null) {
              if (other.requestor != null)
                  return false;
          } else if (!requestor.equals(other.requestor))
              return false;
          return true;
      }
  
  
      public static class ItemLocations{
          private String tcin;
  
          private Integer[] locationIds;
  
          public String getTcin() {
              return tcin;
          }
  
          public void setTcin(String tcin) {
              this.tcin = tcin;
          }
  
          public Integer[] getLocationIds() {
              return locationIds;
          }
  
          public void setLocationIds(Integer[] locationIds) {
              this.locationIds = locationIds;
          }
  
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + Arrays.hashCode(locationIds);
              result = prime * result + ((tcin == null) ? 0 : tcin.hashCode());
              return result;
          }
  
          @Override
          public boolean equals(Object obj) {
              if (this == obj)
                  return true;
              if (obj == null)
                  return false;
              if (getClass() != obj.getClass())
                  return false;
              ItemLocations other = (ItemLocations) obj;
              if (!Arrays.equals(locationIds, other.locationIds))
                  return false;
              if (tcin == null) {
                  if (other.tcin != null)
                      return false;
              } else if (!tcin.equals(other.tcin))
                  return false;
              return true;
          }
      }
  
  }
  </code></pre>
  
  <p>When I try to do a hibernate save operation on the same, it throws not serializable exception. The exact exception is as follows:</p>
  
  <blockquote>
    <p>Caused by: org.hibernate.type.SerializationException: could not serialize
        at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:119) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:144) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.internal.util.SerializationHelper.clone(SerializationHelper.java:75) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.type.descriptor.java.SerializableTypeDescriptor$SerializableMutabilityPlan.deepCopyNotNull(SerializableTypeDescriptor.java:43) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.type.descriptor.java.SerializableTypeDescriptor$SerializableMutabilityPlan.deepCopyNotNull(SerializableTypeDescriptor.java:30) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.type.descriptor.java.MutableMutabilityPlan.deepCopy(MutableMutabilityPlan.java:35) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:283) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:279) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:51) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:264) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:178) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at com.sun.proxy.$Proxy101.persist(Unknown Source) ~[na:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at com.sun.proxy.$Proxy101.persist(Unknown Source) ~[na:na]
        at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:508) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504) ~[spring-data-commons-1.13.1.RELEASE.jar:na]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:489) ~[spring-data-commons-1.13.1.RELEASE.jar:na]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461) ~[spring-data-commons-1.13.1.RELEASE.jar:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) ~[spring-data-commons-1.13.1.RELEASE.jar:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.7.RELEASE.jar:4.3.7.RELEASE]
        ... 85 common frames omitted
    Caused by: java.io.NotSerializableException: com.tgt.scmd.inbound.domain.SupplyChainBreakPackAuth$ItemLocations
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) ~[na:1.8.0_121]
        at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378) ~[na:1.8.0_121]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) ~[na:1.8.0_121]
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) ~[na:1.8.0_121]
        at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:115) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
        ... 132 common frames omitted</p>
  </blockquote>