#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») сработала.