I have checked different sources but none solve my problem, such as: https://coderanch.com/t/671882/databases/Updating-child-DTO-object-MapsId
My case: I have created 2 classes, 1 repository as below:
@Entity
public class Parent{
  @Id
  public long pid;
  public String name;
  @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
  public List<Child> children;
}
-------------------------------------------------------------------
@Entity
public class Child{
  @EmbeddedId
  public PK childPK = new PK();
  public String name;
  @ManyToOne
  @MapsId("parentPk")
  @JoinColumn(name = "foreignKeyFromParent")
  public Parent parent;
  @Embeddable
  @EqualsAndHashCode
  static class PK implements Serializable {
      public long parentPk;
      public long cid;
  }
}
------------------------------------------------------------------------
public interface ParentRepository extends JpaRepository<AmazonTest, Long> {
}
Where Parent and Child has One To Many relationship. In my main method:
public static void main(String[] args) {
    @Autowired
    private ParentRepository parentRepository;
    Parent parent = new Parent();
    parent.pid = 1;
    parent.name = "Parent 1";
    Child child = new Child();
    List<Child> childList = new ArrayList<>();
    child.childPK.cid = 1;
    child.name = "Child 1";
    childList.add(child);
    parent.children= childList;
    parentRepository.save(parent);
    parentRepository.flush();
}
When I run the application for the first time, data can successfully saved to the database. But if I run it again, it gives error "Exception: org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session". 
I was expecting if the data is new, it will update my database, if data is the same, nothing happen. What's wrong with my code.
If I made parent stand alone (without any relationship with the child). It will not give any error even I rerun the application.
Edited: However, if I use the below implementation with simple primary key in Child Entity, it will work as I expected. I can rerun the application without error. I can also change the value, such as the child.name and it will reflect in database.
@Entity
public class Parent{
   @Id
   public long pid;
   public String name;
   @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
   public List<Child> children;
}
-------------------------------------------------------------------
@Entity
public class Child{
   @Id
   public long cid;
   public String name;
   @ManyToOne
   @JoinColumn(name = "foreignKeyFromParent")
   public Parent parent;
}
------------------------------------------------------------------------
public interface ParentRepository extends JpaRepository<AmazonTest, Long> {
}
-------------------------------------------------------------------------
public static void main(String[] args) {
   @Autowired
   private ParentRepository parentRepository;
   Parent parent = new Parent();
   parent.pid = 1;
   parent.name = "Parent 1";
   Child child = new Child();
   List<Child> childList = new ArrayList<>();
   child.cid = 1;
   child.name = "Child 1";
   childList.add(child);
   parent.children= childList;
   parentRepository.save(parent);
   parentRepository.flush();
}