Сохранение ошибки объекта JPA - TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр - PullRequest
0 голосов
/ 26 марта 2020

Я использую Spring Boot + Spring Data и настраиваю классы сущностей для моделирования таблиц базы данных.

Пользователь может быть связан только с одним приложением, но приложение может иметь много пользователей.

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

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.de,p.model.Application; nested exception is java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.demo.model.Application

Схема базы данных

CREATE TABLE applications (
    id int IDENTITY(1,1) NOT NULL,
    name varchar(30) NOT NULL UNIQUE,
    CONSTRAINT PK_Applications PRIMARY KEY (id)
);

INSERT INTO applications (name)
VALUES ('demo');

CREATE TABLE users (
    id int IDENTITY(1,1) NOT NULL,
    username varchar(20) NOT NULL UNIQUE,
    password varchar(128) NOT NULL,
    disabled tinyint NOT NULL DEFAULT 0,
    application_id int NOT NULL,
    description varchar(255),
    CONSTRAINT PK_Users PRIMARY KEY (id),
    CONSTRAINT FK_Users_ApplicationId FOREIGN KEY (application_id) REFERENCES applications (id)
);

Приложение. java

@Entity
@Table(name="applications")
public class Application {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    public Application() { super(); }

    // getters and setters omitted
}

Пользователи. java

@Entity
@Table(name="users")
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String username;
    private String password;
    private String description;

    private boolean disabled;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "application_id", referencedColumnName = "id")
    private Application application;

    public User() {
        super();
    }

    // getters and setters omitted
}
...