saveorupdate()不起作用,而是执行一个select查询,程序中没有提到这个查询(使用spring+hibernate)

xbp102n0  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(416)

这里是主函数,值已经设置为bean。

package demo.sphbIntegrate;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context=new ClassPathXmlApplicationContext("sphb.xml");
        EmployeeDAO edao=(EmployeeDAO) context.getBean("d");
        Employee e=new Employee();
        e.setId(1);
        e.setName("sourav");
        e.setSalary(100000);
        edao.saveEmployee(e);
    }
}

这是bean类。

package demo.sphbIntegrate;

public class Employee 
{
    private int id;
    private String name;
    private int salary;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }

}

这是我的刀课。

package demo.sphbIntegrate;

import org.springframework.orm.hibernate5.HibernateTemplate;

public class EmployeeDAO 
{
    HibernateTemplate template;

    public void setTemplate(HibernateTemplate template) {
        this.template = template;
    }

    public void saveEmployee(Employee e) 
    {
	template.saveOrUpdate(e);
    }
}

根据代码,必须将记录输入表中。然而,发生了一些奇怪的事情,执行了一个select查询,这在整个程序中没有提到。我不能把我的头围绕着这个异常。ps:我确信,我运行的程序是正确的,所有文件都保存正确,而且整个包中没有编写select查询的代码。
以下是输出:

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: select employee_.ID, employee_.NAME as NAME2_0_, employee_.SALARY as SALARY3_0_ from EMPLOYEE employee_ where employee_.ID=?
qco9c6ql

qco9c6ql1#

在这种情况下没有什么可担心的,因为 saveOrUpdate() 完成保存和更新工作。
它首先检查您传递的id是否存在于表中,原因与您看到的select查询相同。如果你仔细观察你的问题

select employee_.ID, employee_.NAME as NAME2_0_, employee_.SALARY as SALARY3_0_ from EMPLOYEE employee_ where employee_.ID=?

你会看到的 ID 在什么情况下。
如果此查询不返回结果,则只插入新记录,否则将进行更新。

相关问题