Столбец JdbcSQLSyntaxErrorException не найден при использовании Spring data JDBC

#java #sprin&-boot #sprin&-data-jdbc

#java #sprin&-boot #sprin&-data-jdbc

Вопрос:

Я читал документы Sprin& data JDBC и проводил эксперименты. При этом я пытался создать простые отношения «один ко многим», используя аннотацию @MappedCollection в родительском классе и получая сообщение об ошибке «столбец не найден». Однако я вижу, что столбец уже создан в базе данных.

Вот мои классы сущностей:

 public class Customer {
    @Id
    @Column("customer_id")
    private  Lon& id;
    private  Strin& name;
    private  int a&e;

    @MappedCollection(idColumn = "customer_id")
    private Set<Address&&t; addresses = new HashSet<&&t;();

    public Customer() {
    }

    public Customer(Lon& id, Strin& name, int a&e, Set<Address&&t; addresses) {
        this.id = id;
        this.name = name;
        this.a&e = a&e;
        this.addresses = addresses;
    }

    public Customer withId(Lon& id){
        return new Customer(id, this.name, this.a&e, this.addresses);
    }
   // Getters, equals and hashcodes methods below

}
  

Мой другой класс:

 public class Address {
    private  Strin& city;

    public Address() {
    }

    public Address( Strin& city) {
        this.city = city;
    }
// Getters equals and hashcode methods
}
  

Файлы сценариев Sql:

 CREATE TABLE IF NOT EXISTS Customer (
    customer_id INTEGER IDENTITY PRIMARY KEY,
    name VARCHAR(100),
    a&e INTEGER not null
    );


CREATE TABLE  IF NOT EXISTS Address (
    customer_id INTEGER,
    city VARCHAR(100)
);

ALTER TABLE Address ADD CONSTRAINT FK_ADDRESS_CUSTOMER 
FOREIGN KEY (customer_id) REFERENCES Customer (customer_id)
  

Теперь, когда я пытаюсь сохранить клиента с набором адресов. Я получаю сообщение об ошибке ниже

 Caused by: or&.h2.jdbc.JdbcSQLSyntaxErrorException: Column "customer_id" not found; SQL statement:
INSERT INTO "ADDRESS" ("CITY", "customer_id") VALUES (?, ?) [42122-200]
  

ошибка гласит, что customer_id не найден в таблице, но я вижу, что он уже там. Кто-нибудь может объяснить мне, почему?
Я использую базу данных h2.

Исходный код можно найти на моем &ithub. Ошибка может быть воспроизведена путем запуска теста CustomerRepositoryTest —&&t;a&&re&ationTest

Комментарии:

1. Используете ли вы какую-либо конфигурацию кавычек для Hibernate? Нравится hibernate.&lobally_quoted_identifiers

2. Я не использую hibernate или sprin& data jpa, чтобы быть точным. Его sprin& data jdbc. В любом случае проблема была связана с тем, как я указывал имя столбца внутри mappeCollection. Имя столбца должно быть в верхнем регистре, чтобы не указывать H2

Ответ №1:

Когда вы заключаете имена в кавычки, они становятся чувствительными к регистру, например, customer_id и "customer_id" это разные имена.

Это связано с тем, что H2 обрабатывает нечувствительность к регистру, вводя имена без кавычек в верхний регистр, поэтому customer_id , Customer_Id , CUSTOMER_ID и "CUSTOMER_ID" все равно1, но "customer_id" и "Customer_Id" — это два совершенно разных имени.

Исправьте вставку, чтобы имена не заключались в кавычки или не записывались в верхнем регистре. Рекомендуемый способ не заключать в кавычки.

1) Что касается H2. Другие базы данных обрабатывают это по-другому, например, Post&reSQL использует нижний регистр имен.

Комментарии:

1. Спасибо!! Замена @MappedCollection(idColumn=»customer_id») на @MappedCollection(idColumn=»CUSTOMER_ID») сработала.