我正在尝试以这种方式更新实体字段:
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/