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

标签 java mysql hibernate

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

    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 调用(没有选择)的情况下为 User 对象创建代理对象,并将 id = 4 连接到代理对象。它只是带有 ID 和有关 session 、对象类型、id 的信息的代理...
只有当您调用代理方法时,才会对数据库进行真正的收集 - 它是加载/选择查询,从数据库加载真实对象。在您的情况下,您在代理对象上调用 setName("Bober11"),结果您会看到选择查询。

如果您需要通过 id 更新用户信息而无需额外的 hibernate 选择,请使用 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();

关于java - 为什么 load() 的工作方式与 Hibernate 中的 get() 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45098996/

相关文章:

java - 对于 : 1, 类模型,找到了多个具有给定标识符的行 : com.。诊断

java - 如何在 Canvas 上绘制全部大写的文本

php - 计算两个日期包含的日历月数

java - Spring数据查询限制作为参数

php - 如何将 php ajax 文本框值插入到 mysql 数据库表中?

mysql - 获取前 5 名总结果

hibernate - 有 hibernate 中批处理的示例吗?

Java、策略模式、泛型和返回类型

java - 在点数组列表中查找重复点

java - Excel中根据日期对数据进行排序