It seems very clear that the JPA spec expects the following mapping to work:
@Entity static class Loan { @Id @Column(name = "LOAN_ID") private Long id; @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan") private List<Extension> extensions = new ArrayList<>(); } @Entity static class Extension { @Id @Column(name = "EX_LOAN_ID") private Long exLoanId; @Id @Column(name = "EX_NO") private Long exNo; @Column(name = "EX_EXTENSION_DAYS") private Long exExtensionDays; @ManyToOne @MapsId @JoinColumn(name = "EX_LOAN_ID") private Loan loan; }
The workaround is to use insertable=false, updateable=false instead of @MapsId.
@Entity static class Loan { @Id @Column(name = "LOAN_ID") private Long id; @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan") private List<Extension> extensions = new ArrayList<>(); } @Entity static class Extension { @Id @Column(name = "EX_LOAN_ID") private Long exLoanId; @Id @Column(name = "EX_NO") private Long exNo; @Column(name = "EX_EXTENSION_DAYS") private Long exExtensionDays; @ManyToOne @JoinColumn(name = "EX_LOAN_ID", insertable = false, updatable = false) private Loan loan; }