Размер приращения последовательности установлен на [50] в сопоставлении сущностей, в то время как размер приращения связанной последовательности базы данных равен [1]

#spring-boot #hibernate #jpa #oracle11g #hibernate-entitymanager

Вопрос:

Я слежу за обучением Spring 5 и т. Д. На udemy, и я нахожусь в той части, где мы тестируем наше приложение. До сих пор все работало нормально, я смог подключиться к базе данных PostgreSQL и все, но теперь я застрял на этом тесте, провалившемся 2 дня назад.

Я не понимаю, что является причиной провала теста. Приложение запускается, но тест не выполняется. Вот он, тестовый класс:

 package com.ghevi.dao;

import com.ghevi.pma.ProjectManagementApplication;
import com.ghevi.pma.dao.ProjectRepository;
import com.ghevi.pma.entities.Project;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlGroup;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.assertEquals;

@ContextConfiguration(classes= ProjectManagementApplication.class)
@RunWith(SpringRunner.class)
@DataJpaTest // for temporary databases like h2
@SqlGroup({
        @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:schema.sql", "classpath:data.sql"}),
        @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = "classpath:drop.sql")
})
public class ProjectRepositoryIntegrationTest {

    @Autowired
    ProjectRepository proRepo;

    @Test
    public void ifNewProjectSaved_thenSuccess(){
        Project newProject = new Project("New Test Project", "COMPLETE", "Test description");
        proRepo.save(newProject);

        assertEquals(5, proRepo.findAll().size());
    }

}
 

И это трассировка стека:

https://pastebin.com/WcjNU76p

Класс сотрудника (не обращайте внимания на комментарии, они, вероятно, мусор):

 package com.ghevi.pma.entities;

import javax.persistence.*;
import java.util.List;

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_seq") // AUTO for data insertion in the class projmanagapplication (the commented out part), IDENTITY let hibernate use the database id counter.
    private long employeeId;                            // The downside of IDENTITY is that if we batch a lot of employees or projects it will be much slower to update them, we use SEQUENCE now that we have schema.sql (spring does batch update)

    private String firstName;
    private String lastName;
    private String email;

    // @ManyToOne many employees can be assigned to one project
    // Cascade, the query done on projects it's also done on children entities
    @ManyToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST}, // Standard in the industry, dont use the REMOVE (if delete project delete also children) or ALL (because include REMOVE)
               fetch = FetchType.LAZY)  // LAZY is industry standard it loads project into memory, EAGER load also associated entities so it slows the app, so we use LAZY and call child entities later
    //@JoinColumn(name="project_id")  // Foreign key, creates a new table on Employee database
    @JoinTable(name = "project_employee",  // Merge the two table using two foreign keys
               joinColumns = @JoinColumn(name="employee_id"),
               inverseJoinColumns = @JoinColumn(name="project_id"))

    private List<Project> projects;

    public Employee(){

    }

    public Employee(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public List<Project> getProjects() {
        return projects;
    }

    public void setProjects(List<Project> projects) {
        this.projects = projects;
    }

    /* Replaced with List<Project>
    public Project getProject() {
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }
    */

    public long getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(long employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
 

Кроме того, именно schema.sql здесь я ссылаюсь на эти последовательности, поскольку этот файл запускается тестом, я только что заметил, что IntelliJ отмечает некоторые ошибки в этом файле. Например, он помечает красным некоторые пробелы и букву T ТАБЛИЦЫ, говоря:

 expected one of the following: EDITIONING FORCE FUNCTION NO OR PACKAGE PROCEDURE SEQUENCE TRIGGER TYPE VIEW identifier
 
 CREATE SEQUENCE IF NOT EXISTS employee_seq;

CREATE TABLE IF NOT EXISTS employee ( <-- here there is an error " expected: "

employee_id BIGINT NOT NULL DEFAULT nextval('employee_seq') PRIMARY KEY,
email VARCHAR(100) NOT NULL,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL

);

CREATE SEQUENCE IF NOT EXISTS project_seq;

CREATE (the error i described is here -->) TABLE IF NOT EXISTS project (

project_id BIGINT NOT NULL DEFAULT nextval('project_seq') PRIMARY KEY,
name VARCHAR(100) NOT NULL,
stage VARCHAR(100) NOT NULL,
description VARCHAR(500) NOT NULL

);


CREATE TABLE IF NOT EXISTS project_employee ( <--Here again an error "expected:"

project_id BIGINT REFERENCES project, 
employee_id BIGINT REFERENCES employee

);
 

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

1. Добавьте трассировку стека как текст, а не как ссылку

2. Прочитайте сообщение об ошибке: *Размер приращения последовательности [employee_seq] установлен на [50] в сопоставлении сущностей, в то время как размер приращения связанной последовательности базы данных равен [1].

3. Я не могу добавить трассировку стека, потому что в ней слишком много символов :/ А также у парня в учебнике также есть это предупреждение при запуске теста, но оно не проваливает его тест.

4. @Ghevi, пожалуйста, прикрепите класс сотрудника

5. Кроме того, измените заголовок этого сообщения об ошибке в конце стека: «Размер приращения последовательности [employee_seq] установлен на [50] в сопоставлении сущностей, в то время как размер приращения связанной последовательности базы данных равен [1]».

Ответ №1:

Вы никогда не рассказываете ему о последовательности, только о том, как называется генератор

Попробуй

 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_generator")
@SequenceGenerator(name = "employee_generator", sequenceName = "employee_seq", allocationSize = 1)
 

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

1. Это устранило ошибку, но теперь у меня есть еще одна : GenerationTarget столкнулся с командой принятия исключения : Ошибка при выполнении DDL «создать проект таблицы (project_id, значение не равно нулю, varchar описания(255), varchar имени(255), varchar этапа(255), первичный ключ (project_id))» с помощью инструкции JDBC

2. @Ghevi Мне нужно было бы посмотреть класс проекта

Ответ №2:

У меня была та же проблема. Добавление приведенной ниже аннотации разрешило эту проблему. @SequenceGenerator(name = "employee_seq", allocationSize = 1)

Ответ №3:

Возможно, что-то не так с определением генератора в сущности сотрудника. «Генератор» должен быть «именем» генератора последовательности, а не именем других вещей, таких как последовательность. Возможно, из-за того, что вы дали имя последовательности и у вас не было генератора с таким именем, он использовал предварительное распределение по умолчанию, равное 50.

Кроме того, стратегия должна быть ПОСЛЕДОВАТЕЛЬНОЙ, но не требуется, если вы определяете генератор, она актуальна только тогда, когда вы не определяете генератор.

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

1. я прикрепил сотрудника класса, где стратегия действительно является ПОСЛЕДОВАТЕЛЬНОСТЬЮ. Я сейчас немного растерян, где вы определяете генератор последовательности? я помню, что назвал employee_seq и project_seq что-то кем-то, как и в этих двух сущностях РЕДАКТИРОВАТЬ: да, я помню, что назвал их в schema.sql, например: employee_id BIGINT NOT NULL ПО УМОЛЧАНИЮ nextval(’employee_seq’) ПЕРВИЧНЫЙ КЛЮЧ