2016-11-17 8 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セッションにキャッシュされてはなりません。あるいは、エンティティのクローンを作成することを検討することもできます。 mapstructやDozerのようなマッピングライブラリを利用することで実現できます。 – Thomas

+0

あなたのヒントありがとうございます:)それを試みます –

答えて

2

は、単純にコピーする前に、エンティティを切り離し:

yourEntityManager.detach(copiedTemplate); 
//Save new page 
pageEntity.setTemplate(copiedTemplate); 
関連する問題