Не удалось извлечь информацию о последовательности из ОШИБКИ базы данных, но все еще все работает

#spring #hibernate #spring-orm

#spring #спящий режим #spring-orm

Вопрос:

Я создал таблицы user и UserRole

пользовательская сущность

 @Entity
@Table(name = "USERS")
public class User {
    @Id
    @Column(name = "USERNAME",  nullable = false,  unique = true)
    private String username;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "ENABLED", nullable = false)
    private boolean enabled = true;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
    private Set<UserRole> userRole = new HashSet<>();
  

Пользовательская сущность

 @Entity
@Table(name = "USER_ROLES", uniqueConstraints = @UniqueConstraint(
        columnNames = { "ROLE", "USERNAME" }))
public class UserRole {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "user_role_id",
            unique = true, nullable = false)
    private Integer userRoleId;

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

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;
  

Когда я запускаю свое приложение, я получаю ошибку и эту трассировку стека:

 ERROR JdbcEnvironmentImpl:420 - Could not fetch the SequenceInformation from the database
org.h2.jdbc.JdbcSQLException: Column "start_with" not found [42122-197]
  

Но у меня нет никаких столбцов ‘start_with’. Раньше у моего объекта UserRole не было столбца userRoleId, и все работало нормально, но затем я добавил его, чтобы сделать столбец ‘role’ не уникальным, и тогда это произошло. Но по-прежнему все работает нормально, меня просто беспокоит эта ошибка, что может быть причиной этого?

Ответ №1:

Я предлагаю проверить ваш диалект гибернации.

У меня была похожая ошибка из-за start_value столбца, который Hibernate искал в последовательностях моей базы данных PostgreSQL. Это имя поля является значением по умолчанию в SequenceInformationExtractorLegacyImpl классе Hibernate, который имеет много подклассов, каждый из которых зависит от вашего конкретного сервера базы данных и его версии. Hibernate загружает правильный класс в соответствии с указанным вами диалектом.

В моем случае я использовал org.hibernate.dialect.PostgreSQLDialect dialect, (устаревший) класс, предназначенный для использования с версией PostgeSQL 8.2. Я переключился на org.hibernate.dialect.PostgreSQL9Dialect , поскольку моя база данных была размещена на сервере PostgreSQL 9. И проблема исчезла.

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

1. Я использую org.hibernate.dialect. HSQLDialect.

2. Действительно, у вас есть только один возможный диалект для базы данных Hsql. В любом случае я ошибался: я думал, что моя ошибка исчезла, но она все еще была там. Настоящей причиной моей проблемы является эта ошибка hibernate.atlassian.net/browse/HHH-13291

3. Спустя почти год я погуглил тот же вопрос и нашел свой вопрос здесь. Повторите это снова, и я понял, что этот человек был прав. Все это время я использовал неправильный диалект.

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

5. вероятно, потому, что try catch скрыт внутри dialect. Не удается найти столбец, но игнорируется эта ошибка и продолжается.