2016-11-17 141 views
0

我想在JPA中複製實體(本例中爲PageEntity)。複製JPA中的實體

這是我的代碼:

@Override 
    public PageEntity copyPage(Long pageId, PageEntity pageEntity) { 


     PageEntity pageToCopy=new PageEntity(); 
     BeanUtils.copyProperties(findOne(pageId),pageToCopy); 

     //Save new template 
     TemplateEntity templateCopy = pageToCopy.getTemplate(); 
     templateCopy.setBlocks(null); 
     templateCopy.setId(null); 

     TemplateEntity copiedTemplate = templateDao.saveAndFlush(templateCopy); 

     //Save new page 
     pageEntity.setTemplate(copiedTemplate); 

     Long copiedPageId=pageDao.saveAndFlush(pageEntity).getId(); 

     //Save blocks and parameters 
     List<BlockEntity> blockCopy = pageToCopy.getTemplate().getBlocks(); 

     for(BlockEntity block : blockCopy){ 
      block.setId(null); 
      block.setTemplateId(copiedTemplate.getId()); 
      for(ParameterEntity parameter : block.getParameters()){ 
       parameter.setId(null); 
      } 
      blockDao.saveAndFlush(block); 
     } 

     return pageDao.findOne(copiedPageId); 

    } 

的問題是,我不能改變ID - 我總是得到一個異常:

"identifier of an instance of de.smava.dao.entity.TemplateEntity was altered from 1 to null; nested exception is org.hibernate.HibernateException: identifier of an instance of de.smava.dao.entity.TemplateEntity was altered from 1 to null", 

我完全得到這意味着什麼 - 但仍然。我需要複製整個頁面並創建一個新的ID。如何實現這一目標?

+1

如果你的模型允許它清除標識應該工作 - _if實體是detached_,即它們不能在Hibernate的Session了緩存。或者,您可能需要考慮創建實體的克隆,例如通過使用諸如maptruct或Dozer的映射庫。 – Thomas

+0

感謝您的提示:)將嘗試 –

回答

2

副本前只需卸下實體:

yourEntityManager.detach(copiedTemplate); 
//Save new page 
pageEntity.setTemplate(copiedTemplate);