У меня есть один класс пользователя и один класс заметки, определенные следующим образом:
@Entity
@Table(name = "notes")
public class Note {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String title;
@Column
private String content;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
// getters and setters
}
@Entity
@Table(name="users")
public class User {
@Id
@Column
private int id;
@Column
private String name;
@Column
private String userName;
//getters and setters
}
Я пытаюсь создать «Заметку», и я хочу добиться того, чтобы в качестве части моей полезной нагрузки запроса, Я передам свои данные пользователя с идентификатором, как показано ниже:
[{
"title": "Mynote",
"content": "This is another note",
"user": {
"id": 4,
"name": "user_1",
"userName": "S"
}
}]
Я хочу, чтобы, если "Пользователь" уже был там, он не должен обновлять таблицу пользователей новой записью, а если пользователь с данной Идентификатор не существует, он должен создать новый и связать его с заметками.
Для этого я использовал @ManyToOne(cascade = CascadeType.ALL)
, выше private User user
поля в классе «Заметки». Он работает для одного запроса, но для следующего запроса выдает
java.sql.SQLIntegrityConstraintViolationException:
Duplicate entry '5' for key 'PRIMARY'
Это ожидается, поскольку он пытается вставить одну и ту же строку дважды.
Можно ли добиться этого с помощью некоторой аннотации весной или od Я должен обработать это в своем собственном коде следующим образом: при создании заметки я должен проверить, существует ли пользователь, и если он не существует, то создать новую, а затем сохранить заметку.
(По сути, это то, чего я хочу добиться, используя hibernate / spring-data-jpa, если есть некоторая поддержка).