2015-06-15 8 views
0

Я создал этот код:не сохраняется сущность с Hibernate

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>.

Я получаю сообщение об ошибке, указывающее, что свойство Vendor, которое не должно быть null, имеет значение null.

Спасибо!

+0

Я предполагаю, что вы еще не создали службу, которая сохраняется в продаже, вы создали таблицы базы данных, pojos persistence, но ничего, что говорит java, как сохранить базу данных pojos int he. Это проект, который я сделал несколько месяцев назад о jpa и т. Д., Проверить классы внутри dani/java/examenuf6/controller https://github.com/nagarz/ExamenM03UF6 – Nagarz

+0

Я отредактировал вопрос с кодом обслуживания, чтобы создать 'Sale'. –

ответ

1

Обновление Ответ, соответствующий первой версии вопроса, был полностью удален - короче говоря, он предложил снова очистить изменения после того, как объект был обновлен.

Текущая проблема заключается в смешивании двух видов аннотаций - это, в первую очередь, @ManyToOne аннотация, относящаяся к спецификации JPA, а вторая - @Cascade, которая относится к гибернату.

Поскольку в вашем примере вы ничего не делаете Hibernate, решение должно было бы удалить аннотацию @Cascade и добавить CascadeType.MERGE к @ManyToOne аннотация.

+0

Что вы имеете в виду при слиянии в продаже, у вас есть образец? –

+0

@ Leandro см. Обновленный ответ. – AdamSkywalker

+0

Я предпочитаю установить его после того, как я тестирую идею изменения базы данных. Поэтому я создал обновление метода 'SaleService' и в этом методе проверяю, существует ли сущность, и если это так, я вызываю saveAndFlush из репозитория. Проблема в том, что он не создает поставщика. Я поменяю вопрос на этот метод. См. Обновление. –