Последовательность "HIBERNATE_SEQUENCE" не найдена; Оператор SQL: выберите nextval ('hibernate_sequence')

Я просто тестировал свой класс UserRepo, пока не получил ошибку, указанную в заголовке. Некоторая информация: Моим первичным ключом для таблицы пользователей является имя пользователя (это строка, предоставляемая пользователями, которые входят в приложение).

У меня есть производственная база данных с postgresql, где все это прекрасно работает. Для моих тестовых классов я использую h2 db.

У меня есть класс пользователя:

@Getter
@Setter
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "users")
public class User{
    @Id
    @NotBlank(message = "Username is required")
    private String username;
    @NotBlank(message = "Email is required")
    private String email;
    @NotBlank(message = "Password is required")
    private String password;

    @ManyToMany(cascade = CascadeType.ALL)
    private Collection<Role> roles = new ArrayList<>();

    private Instant created;
    private boolean enabled;
}

У меня нет идентификатора пользователя, так как я хотел, чтобы имена пользователей были уникальными, поэтому я использовал его в качестве своего идентификатора. Мой тестовый класс:

@DataJpaTest
class UserRepoTest {

    @Autowired
    private UserRepo userRepo;

    @PersistenceContext
    private EntityManager entityManager;

    private static User userWithNameAdministrator;

    @BeforeAll
    static void beforeAll() {
        userWithNameAdministrator = UserBuilder.user("administrator", "[email protected]", "administrator").buildUser();
    }

    @Test
    void itShouldfindByUsername() {
        // given
        User expectedUser = userWithNameAdministrator;
        userRepo.save(expectedUser);
        // when
        String username = expectedUser.getUsername();
        User actualUser = userRepo.findByUsername(username);
        // then
        assertThat(actualUser).usingRecursiveComparison()
                .isEqualTo(expectedUser);
    }

А теперь мой метод построителя для пользователя:

public static UserBuilder user(String username, String email, String role) {
        ArrayList<Role> roles = new ArrayList<>();
        roles.add(new Role(null, role));
        return user()
                .withUsername(username)
                .withEmail(email)
                .withEnabled(true)
                .withPassword("t")
                .withCreated(Instant.now())
                .withRoles(roles);
    }

Это еще один класс в пакете Builder.

Наконец мой RepoClass:

@Repository
public interface UserRepo extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

После поиска в Интернете я обнаружил, что Hibernate ищет последовательность, но, поскольку у меня нет аннотации @GeneratedValue, он будет использовать по умолчанию. Есть несколько вопросов по этому поводу, но я, похоже, не нашел ни одного с пользовательским идентификатором (строка) вместо длинного идентификатора.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пожалуйста, создайте последовательность, используя SQL.

создать последовательность hibernate_sequence;

У вас есть какой-нибудь ресурс о том, как это сделать для h2? Или мне просто нужно указать @GeneratedValue (IdentityType = Sequence)?

DJ Freeman 24.11.2022 10:12

@DJFreeman Пожалуйста, не указывайте @GeneratedValue, оно вычисляется автоматически и не поможет. Если вы используете h2 только в памяти, вы можете изменить URL-адрес следующим образом: jdbc:h2:mem:test;INIT=create sequence hibernate_sequence;. Убедитесь, что ваши таблицы также созданы. Ссылка: h2database.com/html/features.html#execute_sql_on_connection

Grim 24.11.2022 11:07

Другие вопросы по теме