spring data jpa composite key duplicate key record insertion resulting in update

java, jpa, spring, spring-data, spring-data-jpa

Solution

The easiest (and least invasive) way to work around this is probably by making sure the id only gets set right before the persist. This can be achieved in a `@PrePersist` callback:

abstract class MobileVerificationDetails {

  @EmbeddedId
  private MobileVerificationKey id;

  @PrePersist
  void initIdentifier() {

    if (id == null) {
      this.id = … // Create ID instance here.
    }
  }
}

Alternatively to that you can enforce `persist(…)` being used by implementing `Persistable` and implementing `isNew()` accordingly. Make sure this method returns `true` on first insert. We usually see people holding a transient boolean flag that is updated in an `@PostPersist`/`@PostLoad` annotated method.

abstract class AbstractEntity<ID extends Serializable> implements Persistable<ID> {

  private @Transient boolean isNew = true;

  @Override
  public boolean isNew() {
    return isNew;
  }

  @PostPersist
  @PostLoad
  void markNotNew() {
    this.isNew = false;
  }
}

Problem

I have one entity having composite key and I am trying to persist it by using spring data jpa repository to mysql databse as given below: ``` @Embeddable public class MobileVerificationKey implements Serializable{ private static final long serialVersionUID = 1L; @Column(name="CUSTOMERID") private Long customerId; @Column(name="CUSTOMERTYPE") private Integer customerType; @Column(name="MOBILE") private Long mobile; @Embeddable public class MobileVerificationKey implements Serializable{ private static final long serialVersionUID = 1L; @Column(name="CUSTOMERID") private Long customerId; @Column(name="CUSTOMERTYPE") private Integer customerType; @Column(name="MOBILE") private Long mobile; //getter and setters } ``` And Entity as ``` @Entity @Table(name="mobileverificationdetails") public class MobileVerificationDetails { @EmbeddedId private MobileVerificationKey key; @Column(name="MOBILETYPE") private String mobileType; @Column(name="MOBILEPIN") private Integer mobilePin; //getters and setters } ``` My spring data jpa repository look like this: ``` public interface MobileVerificationDetailsRepository extends CrudRepository<MobileVerificationDetails, MobileVerificationKey> { @Override MobileVerificationDetails save(MobileVerificationDetails mobileVerificationDetails); @Override MobileVerificationDetails findOne(MobileVerificationKey id); } ``` Now if I am trying to add duplicate record with same key for original record and different values for other fields .when i try to insert second record it results in update of existing record with new values instead of throwing exception for violating primary key constraint...can any one please explain me this behavior.

Original source

Related problems