不是持久化的Hibernate实体

时间:2015-06-15 12:54:19

标签: java spring hibernate jpa

我创建了这段代码:

Sale sale = new Sale();
saleService.create(sale);

Vendor vendor = new Vendor("name");

Sale updatedSale = saleService.findById(sale.getId());
updatedSale.setVendor(vendor);

try {
        saleService.update(updatedSale);
    } catch (EntityNotFoundException ex) {
        System.err.println("");
    }

此外,销售与供应商级联:

@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REFRESH}, targetEntity = Vendor.class)
@Cascade({
    org.hibernate.annotations.CascadeType.SAVE_UPDATE,
    org.hibernate.annotations.CascadeType.PERSIST
        })
private Vendor vendor;

saleService有以下代码:

@Transactional
public Sale create(Sale entity) {
    Sale created = entity;
    saleRepository.saveAndFlush(created);
    return created;
}

@Transactional(rollbackFor = EntityNotFoundException.class)
public Calibration update(Calibration entity) throws EntityNotFoundException {

   if (!calibrationRepository.exists(entity.getId())) {
        throw new EntityNotFoundException();
    }


    return calibrationRepository.saveAndFlush(entity);
}

它也被注释为@Service。存储库是实现JpaRepository<Sale, Long>的接口。

我收到一条错误,指出供应商的name属性不能为空。

谢谢!

1 个答案:

答案 0 :(得分:1)

upd 答案,对应于问题的第一个版本已被完全删除 - 简而言之,它建议在实体更新后再次刷新更改。

目前的问题在于混合两种注释 - 首先是属于JPA规范的@ManyToOne注释,第二种是特定于Hibernate的@Cascade

由于您未在示例中执行任何特定于Hibernate的操作,因此解决方案是删除@Cascade注释并将CascadeType.MERGE添加到@ManyToOne注释。