JPA ManyToMany ничего не возвращает - PullRequest
0 голосов
/ 11 апреля 2019

Я пытался разработать Spring-сервер с использованием JPA, и у меня возникли проблемы с использованием отношений «многие ко многим». Это мои сущности:

@Entity
public class Item {

    @Id
    private Integer id;
    private String name;
    private Float price;
    private Integer weight;


    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name="itemingredient",
            joinColumns = @JoinColumn(name="iditem"),
            inverseJoinColumns = @JoinColumn(name="idingredient"))
    private List<Ingredient> ingredients=new ArrayList<>();

    public Item( String name, Float price, Integer weight, Ingredient... ingredients) {
        //this.id = id;
        this.name = name;
        this.price = price;
        this.weight = weight;
        this.ingredients = Stream.of(ingredients).collect(Collectors.toList());
        this.ingredients.forEach(x->x.getItems().add(this));
    }

    public Item() {

    }

и

@Entity
public class Ingredient {

    @Id
    private Integer id;
    private String name;
    private Float proteins;
    private Float lipids;
    private Float carbohydrates;
    private Float energeticValue;

    @ManyToMany(mappedBy = "ingredients")
    @JsonIgnore
    private List<Item> items=new ArrayList<>();

    public Ingredient(String name, Float proteins, Float lipids, Float carbohydrates, Float energeticValue) {
        //this.id = id;
        this.name = name;
        this.proteins = proteins;
        this.lipids = lipids;
        this.carbohydrates = carbohydrates;
        this.energeticValue = energeticValue;
    }

    public Ingredient(){

    }

Я создал репозитории и остальные контроллеры. Я использую MySQL для моей базы данных. Я уже создал таблицы, и у меня есть таблица "itemingredient" для отношений. Вот моя конфигурация JPA:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "Repository")
public class JPAConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan("model");

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;
    }

    @Bean
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/nha");
        dataSource.setUsername( "root" );
        dataSource.setPassword( "1234" );
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(
            EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);

        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty(
                "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        return properties;
    }
}

Это мой контроллер покоя:

@RestController
@RequestMapping(path="/items")
public class ItemController {
    @Autowired
    private ItemService itemService;

    @RequestMapping(value = "/all",method= RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<Item>> findAll(){
        return new ResponseEntity<>(itemService.findAll(),null, HttpStatus.OK);
    }

После запуска сервера и попытки извлечь все элементы, сервер отправляет обратно пустой список. Я не подключаюсь к своей базе данных должным образом? Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Я решил это. Проблема была в том, что я не написал «Репозиторий» в @ComponentScan, а только в @EnableJpaRepository. Я не знал, что должен был написать это там. Спасибо за вашу помощь!

0 голосов
/ 11 апреля 2019

Попробуйте использовать Object Mapper.Примерно так:

@RequestMapping("/all")
public @ResponseBody String getitemsJSON() {
    ObjectMapper objectMapper = new ObjectMapper();
    //Set pretty printing of json
    objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    List<Item> itemlist = null;
    @SuppressWarnings("unused")
    String exception = null;
    String arrayToJson = null;
    try {
        itemlist = itemService.findAll();
        arrayToJson = objectMapper.writeValueAsString(itemlist );
    } catch (Exception ex) {
        ex.printStackTrace();
        exception = ex.getMessage();
    }
    return arrayToJson;
}

Это мой ответ на другой SO теме .

...