Один ко многим: java.sql.SQLSyntaxErrorException: таблица 'имя_таблицы' не существует - PullRequest
0 голосов
/ 15 января 2019

У меня есть 3 таблицы, «меню», «ингредиенты» и «меню-ингредиенты» (эта содержит внешние ключи) проверяют изображение - База данных

Теперь, когда я устанавливаю отношение один-ко-многим в классе Menu.java, hibernate почему-то думает, что список , к которому у меня есть аннотации, - это имя таблицы:

Ingredients.java:

@Entity
@Table(name = "ingredients")
public class Ingredients {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "ingredient")
private String ingredientName;

@Column(name = "description")
private String ingredientDescription;
//Getters/Setters/Constructor

Menu.java:

@Entity
@Table(name = "menu")
public class Menu {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "name")
private String name;

// Mapping To second table
@OneToMany(cascade = CascadeType.ALL)
private List<Ingredients> ingridients = new ArrayList<>();
// notice the name of this list 'ingridients' and then check the stacktrace.

основной класс:

@SpringBootApplication
public class RecipeappApplication implements CommandLineRunner {

@Autowired
RecipeRepository recipeRepository;

public static void main(String[] args) {
    SpringApplication.run(RecipeappApplication.class, args);

}

@Override
public void run(String... args) throws Exception {

    Menu menu = new Menu("Pizza");
    menu.getIngridients().add(new Ingredients("Cheese","3 slices"));
    menu.getIngridients().add(new Ingredients("Bacon","3 pieces"));


    recipeRepository.save(menu);
    //recipeRepository.save() <- is just the entitymanager.persist() call.
}

и ошибка:

java.lang.IllegalStateException: Failed to execute CommandLineRunner
...
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
...
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement
...
Caused by: java.sql.SQLSyntaxErrorException: Table 'recipe.menu_ingridients' doesn't exist

1 Ответ

0 голосов
/ 15 января 2019

В вашей базе данных у вас есть ассоциативная таблица menu_ingredient, поэтому вам нужно отобразить ее, используя @JoinTable:

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "menu_ingredient",
        joinColumns = @JoinColumn(name = "menu_id"),
        inverseJoinColumns = @JoinColumn(name = "ingredient_id"))
private List<Ingredients> ingredients;
  • @JoinTable аннотация используется для объединения двух таблиц с использованием третьей таблицы (здесь menu_ingredient)
  • joinColumns: столбец третьей таблицы, относящийся к текущему объекту (меню).
  • inverseJoinColumns: столбец третьей таблицы связан связанному лицу (ингредиентам).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...