hibernate отношение не существует

Hibernate + PostgreSQL: отношение не существует-ошибка SQL: 0, SQLState: 42P01

у меня возникли проблемы с работой с PostgreSQL и Hibernate, в частности, проблема, упомянутая в названии. Я искал в Сети уже несколько часов, но ни одно из найденных решений не сработало для меня.

Я использую Eclipse Java EE IDE для веб-разработчиков. Идентификатор сборки: 20090920-1017 с HibernateTools, Hibernate 3, PostgreSQL 8.4.3 на Ubuntu 9.10.

вот соответствующие файлы:

сообщение.класс!—15—>

сообщение.hbm.в XML

спящий режим.контекстно-свободная грамматика.в XML

Main

структура таблицы:

выход консоли Eclipse при запуске

файл журнала PostgreSQL

если я копирую / вставляю запрос в командная строка postgre и поместите значения В и; после этого он работает.

все в нижнем регистре, так что я не думаю, что это проблема.

если я переключаюсь на MySQL, тот же код того же проекта (я только меняю драйвер,URL, аутентификацию), он работает.

3 ответов

что вы ожидаете, что ваше имя базы данных и имя хоста будут? например, каковы ваши параметры psql для подключения к базе данных таким образом?

Совет: в PostgreSQL.conf, некоторые настройки вы можете рассмотреть:

Я только что решил ту же / подобную проблему, указав схему.

решение состояло в том, чтобы включить разрешения на эту схему для пользователя, с которым я входил в систему.

также: отмечая, что хорошим диагностическим инструментом здесь является вход в консоль командной строки postgres с тем же пользователем, что и ваша программа использование и попытка доступа к таблице и схеме таким же образом.

Источник

Односторонние и двусторонние отношения в Hibernate

Всем нам хорошо известен ответ на вопрос, какими могут быть отношения между сущностями в Hibernate и JPA. Вариантов всего четыре:

Для каждого из отношений есть своя аннотация и, казалось бы, на этом можно закончить разговор, но все не так просто. Да и вообще, может ли быть что-то просто в Hibernate ;) Каждое из выше перечисленных отношений может быть односторонним (unidirectional) или двусторонним (bidirectional), и если не принимать это во внимание, то можно столкнуться с массой проблем и странностей.

Для примера возьмем две простейшие сущности: пользователь и контакт. Очевидно, что каждый контакт связан с пользователем отношением многие к одному, а пользователь с контактами отношением один ко многим.

Односторонние отношения

Односторонним называется отношение, владельцем которого является только одна из двух сторон. Отсюда и название. Следует заметить, что при этом вторая сторона об этом отношении ничего не знает. Hibernate будет считать владельцем отношения ту сущность, в которой будет поставлена аннотация отношения.

Давайте попробуем сделать владельцем отношения сторону контакта. При этом сущности будут выглядеть следующим образом.

Если запустить этот код, то Hibernate создаст следующую структуру таблиц, которая выглядит для нас вполне привычно. Отношение между таблицами создается при помощи ссылочного поля user_id в таблице contacts.

Но выбор сущности Contact в качестве стороны владельца отношений в данном случае не очень удачен. Очевидно, что нам чаще нужна информация обо всех контактах пользователя чем о том, какому пользователю принадлежит контакт. Попробуем сделать владельцем контакта сущность пользователя. Для этого убираем поле user из класса Contact и добавляем поле со списком контактов в класс User. Получаем следующий код.

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

Чтобы связать сущности Hibernate создал дополнительную таблицу связи (join table) с именем users_contacts, хотя сущности вполне можно было бы связать через ссылочное поле в таблице contacts, как в предыдущем случае. Честно говоря, я не совсем понимаю, почему Hibernate поступает именно так. Буду рад, если кто-то поможет с этим разобраться в комментариях к статье.

Проблему можно легко решить добавив аннотацию JoinColumn к полю contacts.

При таких настройках связь будет проводиться при помощи колонки user_id в таблице contacts, а таблица связи создаваться не будет.

Двусторонние отношения

Запускаем код и смотрим на структуру таблиц. Помимо таблиц для пользователей и ролей Hibernate создаст две таблицы связи, хотя нам хватило бы и одной.

Дело в том, что вместо одного двустороннего отношения мы с вами сейчас создали два односторонних. Тоже самое произойдет и для отношения один ко многим. Чтобы Hibernate понял, что мы хотим создать именно двустороннее отношение нам нужно указать, какая из сторон является владельцем отношений, а какая является обратной стороной. Это делается при помощи атрибута mappedBy. Важно отметить, что указывается этот атрибут в аннотации, которая находится на противоположной стороне отношения.

Для отношения многие ко многим любая из сторон может быть владельцем. В случае с ролями и пользователями выберем сущность пользователя в качестве владельца. Для этого изменим описание поля users в классе Role следующим образом.

Теперь Hibernate создаст только одну таблицу связи users_roles.

Для такого кода Hibernate создаст привычную нам структуру из двух таблиц со ссылкой на пользователя в таблице контактов.

На этом все на этот раз! Благодарю, что дочитали до конца и надеюсь, что статья была полезной! Разумеется, очень жду от вас обратную связь в виде голосов и комментариев!

Источник

Hibernate-последовательность не существует

Я попытался обновить hibernate с 4 до 5 в моем проекте с spring 4.2 версия. После этого обновления я обнаружил следующую ошибку в трассировке стека, когда я вызвал метод для обновления.

Я изменил автоматический увеличенный идентификатор с аннотацией

тем не менее ошибка остается.

10 ответов:

и пусть DateBase управляет приращением первичного ключа:

решение

объяснение

Я получал ту же ошибку «com.mysql.интерфейс jdbc.исключения.jdbc4.MySQLSyntaxErrorException: таблица ‘ mylocaldb.hibernate_sequence’ не существует».

используя spring mvc 4.3.7 и hibernate версии 5.2.9, приложение сделано с использованием конфигурации на основе spring java. Теперь я должен добавить hibernate.id.new_generator_mappings свойство упоминается @Eva Mariam в моем коде следующим образом:

и он работал как шарм.

Это будет выглядеть как база данных, которую вы используете генерирует идентификаторы. Для MySql или HSQSL существуют поля инкремента, которые автоматически увеличиваются. В Postgres или Oracle они используют таблицы последовательностей. Поскольку вы не указали имя таблицы последовательности, она будет искать таблицу последовательности с именем hibernate_sequence и использовать ее по умолчанию. Поэтому у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получаете эту ошибку.

Если вы используете файлы hbm для определения отображения O/R.

обратите внимание, что:

В Hibernate 5, имя параметра для имени последовательности было изменено.

следующая настройка работала нормально в Hibernate 4:

а в Hibernate 5, тот же файл настройки сопоставления вызовет ошибку «hibernate_sequence не существует».

чтобы исправить эту ошибку, параметр имя надо менять to:

эта проблема потратила меня 2, 3 часа.

и как-то, похоже, есть документ об этом.

мне нужно читать исходный код орг.гибернации.ИД.усиливается.SequenceStyleGenerator, чтобы понять это

в спящем режиме 5.x, вы должны добавить set hibernate.id.new_generator_mappings к false в hibernate.контекстно-свободная грамматика.xml

Это может быть вызвано HHH-10876 который был исправлен, поэтому убедитесь, что вы обновляете:

Я добавил последовательность гибернации в postgres. Запустите этот запрос в Редакторе PostGres:

я узнаю плюсы / минусы использования запроса, но для тех, кто нуждается в помощи, может использовать это.

@GeneratedValue что короткий путь руки вышеуказанного, спящий режим начинает решать самое лучшее стратегия генерации для вас, в данном случае она выбрала

GenerationType.SEQUENCE как стратегия и именно поэтому он ищет

schemaName.hibernate_sequence который представляет собой таблицу для генерации идентификаторов на основе последовательности.

при использовании GenerationType.SEQUENCE в качестве стратегии вам нужно предоставить @TableGenerator следующим образом.

когда вы устанавливаете стратегию это в

исходная проблема будет решена, потому что затем Hibernate перестанет искать таблицу последовательности.

Источник

Hibernate-последовательность не существует

Я изменил автоматически увеличивающийся идентификатор с аннотацией

Все равно ошибка остается.

15 ответов

Вам необходимо установить для Hibernate5.x

Для более старой версии hibernate 4.x:

Также можно поставить:

И позвольте базе данных управлять увеличением первичного ключа:

Работа с Spring Boot

Решение

Объяснение

Это причина этой ошибки:

Он будет следить за тем, как база данных, которую вы используете, генерирует идентификаторы. Для MySql или HSQSL есть поля приращения, которые увеличиваются автоматически. В Postgres или Oracle они используют таблицы последовательности. Поскольку вы не указали имя таблицы последовательности, он будет искать таблицу последовательности с именем hibernate_sequence и использовать ее по умолчанию. Таким образом, у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получаете эту ошибку.

Я получал ту же ошибку «com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘mylocaldb.hibernate_sequence’ не существует».

И это сработало как шарм.

Если вы используете файлы hbm для определения сопоставления O / R.

В Hibernate 4 работал следующий параметр:

Но в Hibernate 5 тот же файл настроек сопоставления вызовет ошибку «hibernate_sequence not exists».

Чтобы исправить эту ошибку, имя параметра должно измениться на:

Эта проблема потратила у меня 2, 3 часа.

Мне нужно прочитать исходный код org.hibernate.id.enhanced.SequenceStyleGenerator, чтобы понять это

Когда вы используете

GenerationType.SEQUENCE как стратегия, и поэтому она ищет

Когда вы используете GenerationType.SEQUENCE в качестве стратегии, вам необходимо предоставить @TableGenerator следующим образом.

Когда вы устанавливаете стратегию, она

Исходная проблема будет решена, потому что тогда Hibernate перестанет искать таблицу последовательности.

На всякий случай, если кто-то выдернет волосы из-за этой проблемы, как я сделал сегодня, я не мог решить эту ошибку, пока не изменил

В hibernate 5.x вы должны добавить для hibernate.id.new_generator_mappings значение false в hibernate.cfg.xml

Также можно поставить:

И позвольте базе данных управлять увеличением первичного ключа:

Приведенный выше ответ мне помог.

Если вы используете версию Hibernate до Hibernate5, @GeneratedValue(strategy = GenerationType.IDENTITY) работает как шарм. Но пост Hibernate5 необходимо следующее исправление.

ПРИЧИНА

В настоящее время, если для hibernate.id.new_generator_mappings установлено значение false, @GeneratedValue (стратегии = GenerationType.AUTO) сопоставляется с нативным. Если это свойство имеет значение true (которое является значением по умолчанию в 5.x), @GeneratedValue (стратегии = GenerationType.AUTO) всегда отображается в SequenceStyleGenerator.

По этой причине в любой базе данных, которая изначально не поддерживает последовательности (например, MySQL), мы собираемся использовать генератор TABLE вместо IDENTITY.

Однако генератор TABLE, хотя и более переносимый, использует отдельную транзакцию каждый раз, когда значение выбирается из базы данных. Фактически, даже если IDENTITY отключает пакетные обновления JDBC, а генератор TABLE использует объединенный в пул оптимизатор, IDENTITY по-прежнему масштабируется лучше.

Это может быть вызвано HHH-10876, который был исправлен, поэтому обязательно обновите его до:

Я добавил последовательность Hibernate в postgres. Запустите этот запрос в редакторе PostGres:

Я выясню плюсы и минусы использования запроса, но кто-то, кому нужна помощь, может это использовать.

Источник

Hibernate — о чем молчат туториалы

Эта статья не будет затрагивать основы hibernate (как определить entity или написать criteria query). Тут я постараюсь рассказать о более интересных моментах, действительно полезных в работе. Информацию о которых я не встречал в одной месте.
image loader

Сразу оговорюсь. Все ниже изложенное справедливо для Hibernate 5.2. Также возможны ошибки в силу того, что я что-то неправильно понял. Если обнаружите — пишите.

Проблемы отображения объектной модели в реляционную

Но начнем все же с основ ORM. ORM — объектно-реляционное отображение — соответственно у нас есть реляционная и объектная модели. И при отображении одной в другую существуют проблемы, которые нам нужно решить самостоятельно. Давайте их разберем.

Для иллюстрации возьмем следующий пример: у нас есть сущность “Пользователь”, который может быть либо джедаем либо штурмовиком. У джедая обязательно должна быть сила, а у штурмовика специализация. Ниже приведена диаграмма классов.

image loader

Проблема 1. Наследование и полиморфные запросы.

В объектной модели есть наследование, а в реляционной нет. Соответственно это и первая проблема — как правильно отобразить наследование в реляционную модель.

Hibernate предлагает 3 варианта ее отображения такой объектной модели:

image loader

В этом случае, общие поля и поля наследников лежат в одной таблице. Используя такую стратегию мы избегаем join-ов при выборе сущностей. Из минусов стоит отметить, что во-первых, мы не можем в реляционной модели задать “NOT NULL” ограничение для колонки “force” и во-вторых, мы теряем третью нормальную форму. (появляется транзитивная зависимость неключевых атрибутов: force и disc).

Кстати, в том числе и по этой причине есть 2 способа указать not null ограничение у поля — NotNull отвечает за валидацию; @Column(nullable = true) — отвечает за not null ограничение в базе данных.

image loader

image loader

В этом случае у нас нет общей таблицы. Используя эту стратегию, при полиморфных запросах мы используется UNION. У нас появляеются проблемы с генераторами первичных ключей и другими ограничениями целостности. Данный тип отображения наследования строго не рекомендуется использовать.

На всякий случай упомяну про аннотацию — @MappedSuperclass. Она используется когда вы хотите “спрятать” общие поля для нескольких сущностей объектной модели. При этом сам аннотированный класс не рассматривается как отдельная сущность.

Проблема 2. Отношение композиции в ООП

Возвращаясь к нашему примеру заметим, что в объектной модели мы вынесли профиль пользователя в отдельную сущность — Profile. Но в реляционной модели мы не стали выделять под нее отдельную таблицу.

Отношение OneToOne чаще является плохой практикой, т.к. в селекте у нас появляется неоправданный JOIN (даже указав fetchType=LAZY в большинстве случаев у нас JOIN останется — эту проблему обсудим позже).

Для отображения композиции в общую таблицу существуют аннотации @Embedable и @Embeded. Первая ставится над полем, а вторая над классом. Они взаимозаменяемые.

Entity Manager

Каждый экземпляр EntityManager-а (EM) определяет сеанс взаимодействия с базой данных. В рамках экземпляра EM-а, существует кэш первого уровня. Тут я выделю следующие значимые моменты:

Под операцией flush скрывается интересная фича hibernate — он пытается снизить время блокировки строк в БД.

Dirty Checking — это механизм, выполняемый во время операции flush. Его цель найти сущности, которые изменились и обновить их. Чтобы реализовать такой механизм, hibernate должен хранить оригинальную копию объекта (то с чем будет сравниваться актуальный объект). Если быть точнее, то hibernate хранит копию полей объекта, а не сам объект.

Тут стоит отметить, что если граф сущностей большой, то операция dirty checking-а может стоить дорого. Не стоит забывать о том, что hibernate хранит 2 копии сущностей (грубо говоря).
С целью “удешевить” этот процесс пользуйтесь следующими фичами:

Как известно hibernate позволяет обновлять сущности только внутри транзакции. Больше свободы предлагают операции чтения — их мы можем выполнять не открывая явно транзакцию. Но в этом как раз и вопрос, стоит ли для операций чтения открывать транзакцию явно?

Приведу несколько фактов:

Генераторы

Генераторы нужны для описания, каким способом первичные ключи наших сущностей будут получать значения. Давайте быстро пробежимся по вариантам:

Deadlock

Давайте разберем на примере псевдокода ситуацию, которая может привести к deadlock-у:

Для предотвращения таких проблем у hibernate есть механизм, который позволяет избежать deadlock-ов такого типа — параметр hibernate.order_updates. В этом случае все update-ы будут упорядочены по id и выполнены. Также еще раз упомяну, что hibernate старается “отсрочить” захват коннекшена и выполнение insert-ов и update-ов.

Set, Bag, List

В hibernate есть 3 основных способа представить коллекцию связи OneToMany.

Возникает вопрос, а что все-таки лучше использовать bag или set? Начнем с того, что при использовании bag-а возможны следующие проблемы:

Сила References

Reference — это ссылка на объект, загрузку которого мы решили отложить. В случае отношения ManyToOne с fetchType=LAZY, мы получаем такой reference. Инициализация объекта происходит в момент обращения к полям сущности, за исключением id (т.к. значение этого поля нам известно).

Стоит отметить, что в случае Lazy Loading-а reference всегда ссылается на существующую строку в БД. Именно по этой причине большинство случаев Lazy Loading-а в отношениях OneToOne не работает — hibernate необходимо сделать JOIN для проверки существования связи и JOIN уже был, то hibernate загружает его в объектную модель. Если же мы укажем в OneToOne связи nullable=true, то LazyLoad должен заработать.

Мы можем и самостоятельно создать reference, используя метод em.getReference. Правда в таком случае нет гарантии, что reference ссылается на существующую строку в БД.

Давайте приведем пример использования такой ссылки:

На всякий случай напомню, что мы получим LazyInitializationException в случае закрытого EM-а или отсоединенной(detached) ссылки.

Дата и время

Не смотря на то что в java 8 появилось прекрасное API для работы с датой и временем, JDBC API по прежнему позволяет работать только со старым API дат. Поэтому разберем некоторые интересные моменты.

Во-первых, нужно четко понимать отличия LocalDateTime от Instant и от ZonedDateTime. (Не буду растягивать, а приведу отличные статьи на эту тему: первая и вторая)

Более интересный и важный момент — как даты сохраняется в базу данных. Если у нас проставлен тип TIMESTAMP WITH TIMEZONE то проблем быть не должно, если же стоит TIMESTAMP (WITHOUT TIMEZONE) то есть вероятность, что дата запишется/прочитается неверная. (за исключением LocalDate и LocalDateTime)

Давайте разберемся почему:

Когда мы сохраняем дату, используется метод со следующей сигнатурой:

Как видим тут используется старое API. Дополнительный аргумент Calendar нужен для того, чтобы преобразовать timestamp в строковое представление. т.е он хранит в себе timezone-у. Если Calendar не передается, то используется Calendar по-умолчанию с таймзоной JVM.

Решить эту проблему можно 3 способами:

Для ответа на этот вопрос нужно понимать структуру класса java.util.Date (java.sql.Date и java.sql.Timestamp его наследники и их отличия в данном случае нас не волнуют). Date хранит дату в миллисекундах c 1970 года грубо говоря в UTC, но метод toString преобразует дату согласно системной timeZone.

Соответственно, когда мы получаем из базы данных дату без таймзоны, она отображатеся в объект Timestamp, так чтобы метод toString отобразил ее желаемое значение. При этом количество миллисекунд с 1970-го года может отличаться (в зависимости от временной зоны). Именно поэтому только локальное время отображается всегда корректно.

Также привожу в пример код, ответственный за преобразование Timesamp в LocalDateTime и Instant:

Batching

По-умолчанию запросы отправляются в БД по одному. При включении batching-а hibernate сможет в одном запросе к БД отправлять несколько statement-ов. (т.е. batching сокращает количество round-trip-ов к БД)

Для этого необходимо:

N+1 проблема

Это достаточно изъезженная тема, поэтому пробежимся по ней быстро.

N+1 проблема — это ситуация, когда вместо одного запроса на выбор N книг происходит по меньшей мере N+1 запрос.

Самый простой способ решения N+1 проблемы это сделать fetch связанных таблиц. В этом случае у нас может возникнуть несколько других проблем:

Тестирование

В идеале development окружение должно предоставлять как можно больше полезной информации о работе hibernate и о взаимодействии с БД. А именно:

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • hi watch приложение для андроид смартфона
  • hi watch видеокамеры приложение