Java 为什么load()的工作方式与Hibernate中的get()相同?

Java 为什么load()的工作方式与Hibernate中的get()相同?,java,mysql,hibernate,Java,Mysql,Hibernate,我正在尝试以以下方式更新实体字段: SessionFactory factory = HibernateUtil.getSessionFactory(); Session session = factory.openSession(); session.beginTransaction(); User user = session.load(User.class, 4); user.setName("Bober11"); session.getTr

我正在尝试以以下方式更新实体字段:

    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.openSession();
    session.beginTransaction();
    User user = session.load(User.class, 4);
    user.setName("Bober11");
    session.getTransaction().commit();
    session.close();
我在想,在这种情况下,Hibernate将更新表中的行而不点击它(我的意思是,没有选择),但是,我在控制台中看到Hibernate正在执行选择:

Hibernate: select user0_.id as id1_1_0_, user0_.email as email2_1_0_, user0_.name as name3_1_0_, user0_.phone as phone4_1_0_ from User user0_ where user0_.id=?
Hibernate: update User set email=?, name=?, phone=? where id=?
也就是说,如果我正在使用get()


为什么会这样?是否可以在不选择的情况下更新和插入?并且不使用直接sql查询语句

当您调用session.load(User.class,4)时,hibernate为用户对象创建代理对象,无需db调用(无需选择),并将id=4连接到代理对象。它只是一个带有ID和会话、对象类型、ID等信息的代理…
只有当您调用代理方法时,才会发生从数据库加载真实对象的load/select查询。在本例中,您在代理对象上调用
setName(“Bober11”)
,结果会看到selectquery

如果需要按id更新用户信息而不需要额外的休眠,请选择使用HQL更新查询:

    String updateUserHql = "update User set name = :newName where id= :userId";
    Query query = session.createQuery(hql);
    query.setLong("userId",userId); // userID= 4
    query.setLong("newName ",newUserName);//Bober11
    query.executeUpdate();
load()
返回代理对象而不命中数据库。只有更改其字段时,才会从数据库中选择对象

get()
返回实际对象,因此总是命中数据库。 如果希望在不进行任何选择的情况下更新表,则必须按如下方式创建HQL查询:

session.createQuery("UPDATE MY_TABLE SET MY_FIELD = 'MY_VALUE'").executeUpdate();

我刚刚意识到,当我设置name字段(user.setName(“Bober11”))时,Hibernate正在执行“select”语句。我想这是load()的预期行为。在get()的情况下,选择发生在get()之后的中间位置。我仍然想知道是否有一种方法可以在不执行select的情况下更新表中的实体?此答案中提供的查询是SQL查询。这个问题要求通过Hibernate进行更新。