Я использую CrudRepository.
Ну какая-то часть кода, сущности:
public class Human {
@Id
@GeneratedValue
Long id;
@Column(name = "first_name")
String firstName;
@Column(name = "last_name")
String lastName;
@JoinColumn(name = "data_document_id")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToOne(cascade = CascadeType.PERSIST)
DataDocument dataDocument;
@OneToMany(mappedBy = "human", cascade = CascadeType.ALL)
@Singular
List<Book> books;
}
public class DataDocument {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
String name;
}
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
Boolean isReaded;
Integer type;
Integer cost;
Instant date;
}
Здесь я делаю POST для создания человека:
{
"firstName": "firstName",
"lastName": "lastName",
"dataDocument": {
"name": "randomDocument"
},
"books": [
{
"isReaded": true,
"type": 0,
"cost": 100,
"date": "2019-06-11"
}
]
}
humanRepository.save(human);
Так что все в порядке, мне нужно получить строку в базе данных:
TABLE HUMAN
human_id = 1, firstName = firstName, lastName = lastName, data_document_id = 1
TABLE DOCUMENT_DATA
data_document_id = 1, name = randomDocument
TABLE BOOK
book_id = 1, human_id = 1, type = 0, cost = 100, date = "2019-06-11", isReaded = true
Тогда я хочу обновить моего человека. Например, json:
{
"id": 1,
"firstName": "firstName",
"lastName": "lastName",
"dataDocument": {
"name": "NEW_DOCUMENT"
},
"books": [
{
"isReaded": true,
"type": 0,
"cost": 100,
"date": "2019-06-11"
}
]
}
Мой метод:
public Human updateHuman(Long humanId, updateHuman){
Human human = humanRepository.findById(humanId);
human.setDocumentData(updateHuman.getDocumentData());
humanRepository.save(human);
}
Тогда в таблице я получу:
TABLE HUMAN
human_id = 1, firstName = firstName, lastName = lastName, data_document_id = 2
TABLE DOCUMENT_DATA
data_document_id = 1, name = randomDocument
data_document_id = 2, name = NEW_DOCUMENT
В этом проблема. Я хочу перезаписать data_document_id = 1 новым именем. Я знаю некоторые решения, такие как
@OneToOne(orphanRemoval = true)
, но это даст следующий результат:
TABLE DOCUMENT_DATA
data_document_id = 2, name = NEW_DOCUMENT
Также я могу написать такой код:
public Human updateHuman(Long humanId, updateHuman){
Human human = humanRepository.findById(humanId);
Long id = human.getDocumentData().getId();
human.setDocumentData(updateHuman.getDocumentData());
human.getDocumentData().setId(id);
humanRepository.save(human);
}
Тогда это будет нормально работать. Но у меня есть 40 полей и 10 из них списки и 10 из них другие объекты со слишком большим количеством полей.
Я просто хочу найти самый простой способ, как я могу обновить объект. Я думал о запросе, но я не уверен, что он будет работать.
Просто у меня есть ЧЕЛОВЕК до UPDATED_SOME_FIELDS = HUMAN_WITH_UPDATED_SOME_FIELDS.