H2 Нарушение ограничения ссылочной целостности

Я использую базу данных H2 приложения весенней загрузки. Я создал один класс обслуживания учетной записи, который используется для сохранения данных учетной записи, типа учетной записи и клиента. Пожалуйста, найдите код ниже:

Конструктор по умолчанию, Getter Setter, Constructor, использующий все поля, toString, hashCode, equals, присутствуют в каждом из приведенных ниже классов.

POJO учетной записи, выступающий в качестве сущности, а также объект передачи данных, т.е. DTO

@Entity
@Table(name = "ACCOUNT")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToOne
    @JoinColumn(name = "account_type_id")
    private AccountType accountType;

    @Temporal(TemporalType.DATE)
    @Column(name = "date_created", unique = true, nullable = false, length = 10)
    private Date dateCreated;

    @Column(nullable = false)
    private double originalCreditAmount;

    @Column(nullable = false)
    private double balanceAmount;

    @Column(nullable = false)
    private boolean fullyPaid;

    @Column(nullable = false)
    private int term;

    @Column(nullable = false)
    private float rateOfInterest;

    @Column(nullable = false)
    private boolean escrowAttached;

    @Column(nullable = false)
    private boolean pmiAttached;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_id", nullable = false)
    @JsonBackReference
    Customer customer;
}

POJO AcountType, выступающий в качестве объекта, а также объекта передачи данных, т.е. DTO

@Entity
@Table(name = "ACCOUNT_TYPE")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class AccountType {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(nullable = false)
    private String accountTypeName;

    @Column(nullable = false)
    private String accountTypeDescription;

}

POJO клиента, выступающий в качестве объекта, а также объект передачи данных, т.е. DTO

@Entity
@Table(name = "customer")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(nullable = false)
    private String firstName;

    @Column(nullable = false)
    private String lastName;

    @Column(nullable = false)
    private String socialSecurityNumber;

    @Temporal(TemporalType.DATE)
    @Column(name = "dob", unique = true, nullable = false, length = 10)
    private Date dateOfBirth;

    @Column(nullable = false)
    private double totalLoanAmount;

    @Column(nullable = false)
    private int bonusPoints;

    @Temporal(TemporalType.DATE)
    @Column(name = "customer_since", unique = true, nullable = false, length = 10)
    private Date memberSince;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Address> addresses = new HashSet<Address>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Account> accounts = new HashSet<Account>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Contact> contacts = new HashSet<Contact>();


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Education> education = new HashSet<Education>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Employment> employment = new HashSet<Employment>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Investment> investments = new HashSet<Investment>();


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
    @JsonManagedReference
    private Set<Liability> liabilities = new HashSet<Liability>();


    @Column()
    private int rating;
}

когда я пытаюсь сделать вызов POST для создания клиента, учетной записи и типа учетной записи, как показано ниже:

{
"customer": {
"id": 1,
"firstName": "Jordaya",
"lastName": "Scott",
"dateOfBirth": "1980-04-12",
"totalLoanAmount": 287000,
"bonusPoints": 70000,
"memberSince": "2000-04-11",
"socialSecurityNumber": "449-84-4944",
"rating": 7
},
"accountType": {
"id": 2,
"accountTypeName": "Savings A/C",
"accountTypeDescription": "Savings Account"
},
"dateCreated": "2017-01-01",
"originalCreditAmount": 300000,
"balanceAmount": 200000,
"fullyPaid": false,
"term": 30,
"rateOfInterest": 3.25,
"escrowAttached": false,
"pmiAttached": false
}

Это не удается с ошибкой ниже.

org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FKGW84MGPACW9HTDXCS2J1P7U6J: PUBLIC.ACCOUNT FOREIGN KEY(ACCOUNT_TYPE_ID) REFERENCES PUBLIC.ACCOUNT_TYPE(ID) (2)"; SQL statement:
insert into account (account_type_id, balance_amount, customer_id, date_created, escrow_attached, fully_paid, original_credit_amount, pmi_attached, rate_of_interest, term, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Пожалуйста, исправьте мое понимание ошибки. Я думаю, что эта ошибка возникает из-за того, что запись о клиенте и типе учетной записи не создается в БД, и, следовательно, когда учетная запись вставляется в БД, она не может найти идентификатор типа учетной записи, и поэтому возникает эта ошибка.

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

Ответы 1

Да, если объекты с совпадающими идентификаторами отсутствуют, вы получите нарушение ограничения целостности.

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

@OneToOne(cascade = CascadeType.ALL...)

Но даже тогда, когда вы отправляете данные JSON с определенными идентификаторами, которых нет в БД, вы получите эту ошибку.

Я добавил cascade = CascadeType.ALL в оба столбца соединения (тип учетной записи и клиент) в классе учетной записи и снова попытался выполнить запрос POST, но он не удался с ошибкой «отдельный объект передан для сохранения: com.microservice.model.AccountType;»

user2800089 21.01.2019 13:39

Трудно сказать, что не так, без кода, который выполняет сохранение, но похоже, что вы пытаетесь сохранить каскадный тип учетной записи с идентификатором, для которого уже установлено определенное значение. Вам нужно оставить его нулевым. Но тогда вопрос в том, хотите ли вы этого. Если тип учетной записи с этим идентификатором существует в БД, вам необходимо сначала получить его.

rapasoft 21.01.2019 17:19

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