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を作成する必要があります。これを達成する方法は?
モデルが動作するはずです、それは識別子をクリアできる場合 - _ifを実体がdetached_ある、すなわち、彼らはもうHibernateセッションにキャッシュされてはなりません。あるいは、エンティティのクローンを作成することを検討することもできます。 mapstructやDozerのようなマッピングライブラリを利用することで実現できます。 – Thomas
あなたのヒントありがとうございます:)それを試みます –