Мои классы моделей у меня есть:
LetterDoc.java
@Entity
@Table(name = "letter_doc")
public class LetterDoc implements Serializable {
private static final long serialVersionUID = 1L;
@Id
TwoP twoP;
private String docFile;
//i ommited getters and setters
public LetterDoc() {
}
Document.java
@Entity
@Table(name = "document")
public class Document {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long docId;
private String docName;
@Transient
private boolean checked=false;
public Document() {
}
TwoP.java
@Embeddable
public class TwoP implements Serializable {
@ManyToOne(fetch = FetchType.EAGER, optional = false,cascade=CascadeType.PERSIST)
@JoinColumn(name = "letterNo",unique=true)
@JsonIgnore
private Letter letter;
@ManyToOne(fetch = FetchType.EAGER, optional = false,cascade=CascadeType.PERSIST)
@JoinColumn(name = "documentId",unique=true)
@JsonIgnore
private Document document;
public TwoP(Letter letter, Document document) {
this.letter = letter;
this.document = document;
}
public TwoP() {
}
}
Данные json, которые я отправляю в своем API, отправляемом со стороны клиента:
В моем API я использовал этот метод для получения данных JSON:
@PostMapping(value = "/letter/create", produces = MediaType.APPLICATION_JSON_VALUE)
public SLDto postAllOne(@RequestBody SLDto sldto) {
Letter letter = letterRepository.save(new Letter(clkLetter, sldto.getLetterDto().getInOut(),
sldto.getLetterDto().getInOutNo(), sldto.getLetterDto().getInOutDate(),
sldto.getLetterDto().getLetterIssuedSubBy(), sldto.getLetterDto().getLetterFile(),
sldto.getLetterDto().getRepresentativeName(), selection, assessment));
//Please consider letter is inserted with Id no 22.
for (DocumentDto documentDto : sldto.getDocumentDto()) {
TwoP twoP = null;
LetterDoc letterDoc = null;
System.out.println("loopedonce");
Document document = null;
System.out.println("total documents Id is" + documentDto.getDocId());
document = documentRepository.findById((long) documentDto.getDocId()).get();
System.out.println("Document Id from db is" + document.getDocId());
twoP = new TwoP(letter, document);
letterDoc = new LetterDoc();
letterDoc.setTwoP(twoP);
letterDoc.setDocFile(null);
letterDocRepository.save(letterDoc);
}
}
SlDto.java класс
private LetterDto letterDto;
private List<DocumentDto> documentDto;
private List<SelectionCustomOfficeDto> selectionCustomOfficeDto;
Теперь в Для цикла , который я использовал выше, он должен быть зациклен дважды, так как число поступающих данных Json равно двум. Да, оно зацикливается дважды, и в этой строке document = documentRepository.findById((long) documentDto.getDocId()).get();
я получаю Document объект дважды, но при вставке в letterDocRepository.save (letterDoc); , он показывает мне
Дублирующая запись '22' для ключа 'UK_5pahc9x5lwh5k4owpm3vjfq3c'
'22 '- это недавний идентификатор, созданный при вставке в таблицу «букв»
Так как мой documentDto.getDocId () возвращает мне 1,2, поступающие из данных JSON, и хотя они отличаются, но программа показывает ошибку.
Чтобы увидеть также, что происходит, я отладил их, чтобы увидеть, поступают ли данные из базы данных как:
Ошибка:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '22' for key 'UK_5pahc9x5lwh5k4owpm3vjfq3c'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_161]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_161]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_161]
at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_161]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.47.jar:5.1.47]
at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.47.jar:5.1.47]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) ~[mysql-connector-java-5.1.47.jar:5.1.47]