【问题标题】:How to copy the record in hibernate with new primary key?如何使用新的主键复制休眠中的记录?
【发布时间】:2014-11-12 06:55:08
【问题描述】:

我想将一个表的记录复制到同一个表中(除了用以前的记录值保存新记录,这里主键将自动递增)那么如何在休眠中执行它(有没有像这样的直接方法session.save(Obj)),我使用的是 Hibernate 4.1.12。

【问题讨论】:

  • 克隆并保存。或者更确切地说,使用自定义克隆方法并保存新对象。

标签: java hibernate-4.x


【解决方案1】:

您可以尝试将所有主键列设置为空,然后使用 Session.Save(obj)。

【讨论】:

  • 当时它给出了像Hibernate这样的异常:“identifier of an instance changed from A to B”
  • 如果出现此错误,则表示对象尚未从会话中分离,您将 id 更新为 null。尝试先使用evict 方法分离对象
【解决方案2】:

让我们考虑一下:

  1. 您的表名为“TestTable”,主键为“id”(需要的键 自动递增)。
  2. 您的模型类是“测试”,它有一个字段 'id' 映射到表 'TestTable' 的 'id' 列。

您可以使用以下方法实现您的目标:

Test  test  = (Test) sessionFactory.getCurrentSession().createCriteria(Test.class).add(Restrictions.eq("id", id)).uniqueResult();
test.setId(null);
sessionFactory.getCurrentSession().saveOrUpdate(test);

【讨论】:

  • 这里也会给出异常,例如(类名)实例的标识符从实际 PrimaryKey 更改为 null,我认为使用 saveOrUpdate(obj) 将无法正常工作。
【解决方案3】:

试试这个

Test  test  = (Test) sessionFactory.getCurrentSession().createCriteria(Test.class).add(Restrictions.eq("id", id)).uniqueResult();
Test t=new Test();
t.setName(test.getName());
t.setAge(test.getAge());
sessionFactory.getCurrentSession().save(t);

或者 如果您的表已创建日期或修改日期字段,请更改这两个值并保存。

Test  test  = (Test) sessionFactory.getCurrentSession().createCriteria(Test.class).add(Restrictions.eq("id", id)).uniqueResult();
test.setCreatedDate(new Date());
sessionFactory.getCurrentSession().save(test);

【讨论】:

  • 它可以工作,但我认为如果我们的 POJO 有更多属性,这将是一个漫长的过程。
  • 你能给我一个克隆的例子吗?我找不到例子。
  • 测试 t1=test.Clone(); sessionFactory.getCurrentSession.save(t1);
  • 这个 Clone() 方法从何而来?
  • Test test = (Test) sessionFactory.getCurrentSession().createCriteria(Test.class).add(Restrictions.eq("id", id)).uniqueResult();测试 t=test.clone(); t.setName(test.getName()); t.setAge(test.getAge()); sessionFactory.getCurrentSession().save(t);
【解决方案4】:

您可以在保存新对象之前尝试逐出之前的对象。

Test  test  = (Test) sessionFactory.getCurrentSession().createCriteria(Test.class).add(Restrictions.eq("id", id)).uniqueResult();
sessionFactory.getCurrentSession().evict(test);
test.setId(1);
sessionFactory.getCurrentSession().save(test);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2017-06-30
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多