使用Java Hibernate API持久化实体,如果已经存在,则进行更新

使用Java Hibernate API持久化实体,如果已经存在,则进行更新,java,hibernate,jpa,Java,Hibernate,Jpa,具有下表和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'

具有下表和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);


非常感谢您提供的任何帮助或文档。

合并既可以更新也可以插入,但您应该检查对象是否存在于数据库中,以查看是否必须将计数器设置为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);
    });
}

您是否在实体的主键字段上正确设置了@Id注释。对于merge()识别新的(瞬态)实例和分离的实例,该键很重要。
saveSearchParams() {
        searchTerms.forEach(o -> {
            SearchTerms term = new SearchTerms();
            term.setSearchCount(1);
            term.setTerm((String) o);
            term.setUserEmail(email);
            jpaApi.em().merge(term);
        });
}

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);
    });
}