当前位置: 首页 > 面试题库 >

Hibernate合并

宋宏儒
2023-03-14
问题内容

我正在测试hibernate并将此查询提供给

transaction = session.beginTransaction();
city = new City("A");
city  = (City)session.merge(city);
city.setName("B");
transaction.commit();

我在命令行中得到这些查询:

Hibernate: insert into CITY (name) values (?)
Hibernate: update CITY set name=? where CITY_ID=?

我使用的是“合并不保存”,所以为什么hibernate正在更新我的对象,所以不应该更新。对吗 怎么了


问题答案:

我将尝试使用一个更具体的示例进行解释。假设您有以下情况:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA = (User)session.get(User.class, 1101);
transaction.commit();
session.close();
// Since session is closed, userA is detached.

session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB = (User)session.get(User.class, 1101);
//Now here,  userB represents the same persistent row as userA.
//When an attempt to reattach userA occurs, an exception is thrown
session.update(userA);
transaction.commit();
session.close();

尝试重新附加分离的对象时发生异常,userA。

Exception in thread "main" org.hibernate.NonUniqueObjectException: a   
different object with the same identifier value was already associated
with the session:

This is because Hibernate is enforcing that only a single instance of a Persistent    object exists in memory.

为了解决上述问题,使用了merge(),如下所示:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA = (User)session.get(User.class, 1101);
transaction.commit();
session.close();
//userA is now detached as session is closed.

session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB = (User)session.get(User.class, 1101);
User userC = (User)session.merge(userA);
if (userB == userC) {
  System.out.println("Reattched user is equal");
}
transaction.commit();
session.close();


 类似资料:
  • 问题内容: 我一直遇到这个问题: 我想让hibernate管理一个表示集合集合的表。例如: 地图地图 套装清单 清单地图 例如,我希望能够代表这一点: 作为一个表: 没有自定义的hibernate代码似乎是不可能的,我不介意。但是我希望有人对自定义代码的外观有所指导。 我应该扩展AbstractPersistentCollection吗? CompositeUserType? 可以管理多个表是否正

  • 问题内容: 我在父类和子类之间定义了双向的一对多关系。我正在寻找执行一个查询,以便我可以在bean中返回一个父对象及其子对象的子集。 我想要实现的输出是: 我想过滤父母的ID和孩子的年龄列。我尝试了多种查询组合以获取所需的输出。 以下内容很接近,但没有将子级分组到我定义的ParentChildWrapper bean中的集合中。我得到的结果是对象列表,每个孩子有1个实例与年龄过滤器匹配: 我还尝试

  • 问题内容: 在具有两种类型的实体(父级和子级)的场景中: 父母-@OneToMany Collection孩子; 默认值为对子级集合进行延迟加载。这种模式对少数儿童非常有效,但是如果这个数字很大,这似乎是不可持续的。因此,在某些情况下,我认为孩子的数量会很大,因此我使用了分页的服务方法(例如“ getChildren(父父母,int偏移量,int计数)”)。 问题是:这是处理此类情况的最佳方法吗?

  • 我在使用复合主键的hibernate实体集时遇到了问题。 我们的应用程序中有一个概念“Target”。目标id应该是其他三个表(实体)主id的组合。目标也有一个int标记。员工应该有一系列目标。SQL如下所示: 这个SQL工作正常,它允许我每个role_id(员工)多个目标,只要应用程序和项目分类不同。 这是目标ID类 这是目标类 这是employee类,我想在其中为每个员工存储一组目标。 通过h

  • 我正在将JPA与Hibernate和Spring启动器数据jpa一起使用。我想合并/更新一组项目。如果它是一个新项目,我想保留,如果它是一个已经存在的项目,我想更新它。 当我这样尝试时,每个项目都会创建一个新的HQL状态并且它不起作用。所以我正在寻找一种方法来一次性保存所有项目(如果可能的话),以节省调用和时间。 我发现: 但是我不能使用这个事务,因为我使用了@Transactional。有办法用

  • 我需要弄清楚如何使用定义为以下内容的枚举参数列表应用基于注释的筛选: 所以我的如下所示: 我见过很多关于如何对单个枚举值进行条件查询和筛选的问题,但还没有关于对一组枚举值进行筛选的问题。是否有一种方法可以显式地强制转换单个值?