CrudRepository не удаляет Объект с отношением

У меня есть базовое приложение SpringBoot. используя Spring Initializer, JPA, встроенный Tomcat, шаблонизатор Thymeleaf и пакет в качестве исполняемого файла JAR. Я создал этот класс репозитория:

@Repository
public interface MenuRepository extends CrudRepository<Menu, Long> {
..
}

и этот класс обслуживания

@Service
@Transactional(readOnly = true)
public class MenuService {

     @Autowired
     protected MenuRepository menuRepository;

     @Transactional
     public void delete (Menu menu) {
         menuRepository.delete  (menu);
     }
     ..
}

и этот тест Junit:

@ContextConfiguration(classes={TestSystemConfig.class})
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MenuGestApplication.class) 
public class MenuServiceTests {
...
@Test
    public void testDelete () {

        Menu menu = new menu(); 
        menu.setmenuId("bacalla-amb-tomaquet");
        menuService.save(menu);

        MenuPrice menuPrice = new menuPrice(menu);
        menuPrice.setPrice((float)20.0);
        menuPriceService.save(menuPrice);

        MenuPriceSummary menuPriceSummary = new menuPriceSummary(menu);
        menuPriceSummary.setFortnightlyAvgPrice((float)20.0);

        menuPriceSummaryService.save(menuPriceSummary);

        menu = menuService.findBymenuId("bacalla-amb-tomaquet");

        assertNotNull (menu);

        menuService.delete (menu);

        menu = menuService.findBymenuId("bacalla-amb-tomaquet");

        assertNull (menu);

    }
}

Но Junit терпит неудачу, потому что объект не удален, и никакое исключение не выдается!

У меня есть это в proerty, как предложено ..

@OneToMany(mappedBy="menu", cascade = CascadeType.ALL,  orphanRemoval = true, fetch=FetchType.LAZY)
    private List<MenuPrice> price;

даже когда я вижу это в консоли при запуске тестов:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`elcormenu`.`t_menu_price`, CONSTRAINT `FK19d0sljpshu4g8wfhrkqj7j7w` FOREIGN KEY (`menu_id`) REFERENCES `t_menu` (`id`))

и класс меню:

@Entity
@Table(name="t_menu")
public class Menu  implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty("id")
    private Long id;    

    @JsonProperty("MenuId")
    private String MenuId;

    @OneToMany(mappedBy = "Menu", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JsonIgnore
    private Set<MenuPrice> MenuPrice = new HashSet<>();

    @OneToOne(mappedBy = "Menu", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JsonIgnore
    private MenuPriceSummary summary;
...
}
4 голоса | спросил en Peris 12 J0000006Europe/Moscow 2018, 16:11:05

4 ответа


0
Вы определяете двунаправленную связь между Menu и MenuPrice, используя как ---- +: = 0 =: + ----, так и ---- +: = 1 =: + ---- .Когда у вас двунаправленные отношения, вам нужно установить обе стороны.В тесте вы устанавливаете Menu в MenuPrice, но не добавляете MenuPrice к набору MenuPrice меню.Включите следующий оператор ---- +: = 2 =: + ---- после создания menuPrice.Вам также не нужно многократное ---- +: = 3 =: + ----, так как вы указали ---- +: = 4 =: + ---- .Попробуйте следующее:В некоторых случаях вам не нужны двунаправленные отношения, и вы можете удалить ---- +: = 6 =: + ---- , но это зависит от того, как вашей бизнес-логике нужно перейти к дочерним элементам или запросить ее через JPA,
ответил Jean Marois 21 J0000006Europe/Moscow 2018, 07:50:29
0
убедитесь, что в дочерних объектах: MenuPrice, MenuPriceSummary у вас есть ---- +: = 0 =: + ---- , что-то вроде
ответил en Lopes 13 J0000006Europe/Moscow 2018, 10:25:35
0
Подумай об этом:Но мой главный вопрос: для чего вы использовали аннотацию ---- +: = 1 =: + ---- в приложении с весенней загрузкой?
ответил Dennis G. 12 J0000006Europe/Moscow 2018, 16:15:18
0
Попробуйте удалить @Transactional ( readOnly = true ) из ---- +: = 0 =: + ---- .Это может предотвратить промывку.В противном случае я бы попробовал подход en Lopes.Есть разные ---- +: = 1 =: + ---- : https://docs.oracle.com/javaee/6/api/javax/persistence/CascadeType.html
ответил ner0 15 J0000006Europe/Moscow 2018, 14:17:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132