我正在使用 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 个是另一个字段太多的实体。
我只想找到更新对象的最简单方法。我考虑过查询,但我不确定它是否会起作用。
只是我有一个 HUMAN 到 UPDATED_SOME_FIELDS = HUMAN_WITH_UPDATED_SOME_FIELDS。