[英]hibernate - saving entity with an entity in it (that already exists in the db)
[英]Persist entity using Java Hibernate API and update if already exists
有下表和Java實體:
CREATE TABLE search_terms (
id int(100) NOT NULL AUTO_INCREMENT,
term varchar(255) NOT NULL DEFAULT '',
last_search_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
search_count int(100) NOT NULL DEFAULT '0',
user_email varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
public class SearchTerms implements Serializable {
private Long id;
private String term;
private Timestamp lastSearchDate;
private int searchCount;
private String userEmail;
想要將給定類型的 java 對象持久化到上表中。
例子:
List<String> searchTerms = Arrays.asList("test1", "test2", "test3");
saveSearchParams(searchTerms);
如果表中存在任何這些術語,我想增加 searchCount 否則另存為新行。
需要使用 JPA.em().merge(o) 等並且沒有 sql 插入/更新查詢
在兩列上添加了以下常量,但 JPA.em().merge(o) 不斷插入新行。
@Table(name="search_terms", uniqueConstraints= { @UniqueConstraint(columnNames = {"term", "user_email"})})
saveSearchParams() {
searchTerms.forEach(o -> {
SearchTerms term = new SearchTerms();
term.setSearchCount(1);
term.setTerm((String) o);
term.setUserEmail(email);
jpaApi.em().merge(term);
});
}
任何幫助或文檔表示贊賞。
Merge 既可以更新也可以插入,但是您應該檢查對象是否存在於 DB 中以查看是否必須將計數器設置為 1 或向其添加 1,為此您必須為每個元素拋出一個查詢。
嘗試這個:
saveSearchParams() {
searchTerms.forEach(o -> {
//search for example by id or in any other way
SearchTerms term = jpaApi.em().find(SearchTerms.class, o.getId());
if (term == null){
term = new SearchTerms();
term.setSearchCount(1);
}else{
term.setSearchCount(term.getSearchCount()+1);
}
term.setTerm((String) o);
term.setUserEmail(email);
jpaApi.em().merge(term);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.