【问题标题】:How to insert/save an object using Hibernate session.save() without updating the old record如何使用 Hibernate session.save() 插入/保存对象而不更新旧记录
【发布时间】:2012-08-07 15:43:24
【问题描述】:

我有一个search.jsp 页面,我可以在其中搜索和检索数据库中的记录。我必须复制这条记录并进行修改并保存两条记录。

例如:

 method1(){
  Response response=new Response();
  //To perform DB search
  response=delegate.requestSearch(//some request criteria);
  Types obj1=(Types) response.getBaseEntity();
  Types obj2=obj1;
  obj2.setPromaryKeyObject(//some unique value);
 }

在我的 DAO 中,保存方法:

session.save(obj1);
session.save(obj2);
transaction.commit(); // transaction

当调试点提交事务时,我只得到一个更新查询。但我希望有两个插入查询。

但这很好用。这是一次尝试,但这不是我想做的。

Types tempObj1 = new Types();    
tempObj1.setValue1(obj1.getValue1();
 // all values of the object should be set
session.save(tempObj1);
Types tempObj1 = new Types();    
tempObj2.setValue1(obj2.getValue1();
 // all values of the object should be set
session.save(tempObj2);
transaction.commit(); // transaction

在这种情况下,我会触发两个插入查询。

我很确定错误出在我的休眠方法中,因为我对休眠非常陌生。当我使用 JDBC 和 MySql 查询时,同样的代码可以正常工作。

【问题讨论】:

    标签: java mysql hibernate jsp jdbc


    【解决方案1】:

    这都是关于 id 的。如果数据库中存在具有给定 ID 的对象,则更新它。如果没有设置 id 则根据生成策略生成并插入新记录。有时(取决于配置)您必须明确设置 id。

    由于您使用 MySQL,我猜您使用 autoincrement 列作为 id 和 IDENTITY 生成策略。您可能需要做的是将 id 保留为更新记录,并将 id 设置为 null 以作为您要插入的新记录。

    【讨论】:

    • >类型 obj2=obj1; obj2.setPromaryKeyObject(//一些唯一值);这就是我在这行代码中所做的。在将 ID 发送到保存方法之前,我正在更改 ID。
    • obj2 和 obj1 是对同一个对象的两个引用
    • 同意。但是属性的值正在改变。
    • 知道了:)。这是一个诚实的错误。谢谢。
    【解决方案2】:

    这是由于obj2 == obj1。试试obj2 = obj1.clone();

    【讨论】:

      【解决方案3】:

      Hibernate 在内部跟踪您拥有save()'d 的对象。您并没有真正使用此代码创建新实例

        Types obj1=(Types) response.getBaseEntity();
        Types obj2=obj1;
      

      所以 hibernate 认为你再次保存了同一个对象而没有更改数据,所以它自然什么也没做。

      有两种方法可以解决这个问题:

      • 将数据复制到新实例并再次调用 save。这个有点 就像您拥有的第二个代码片段一样。
      • 使用不将参数与会话关联的merge() 方法,这样每次调用merge(something) 时都会生成一个插入。 (这假设您已经清除了 something 的 id 并首先将其与会话解除关联。)

      【讨论】:

      • @bill.cn :我不知道如何解除关联。起作用的一件事是关闭会话,提交事务并再次打开会话。但它绝对不能接受。请告诉我正确的方法。我每次都必须保存大约 400 个对象。所以这个 'session.saveOrUpdate(obj)' 在 while 循环中。我卡住了e。请帮忙。
      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多