Я использую базу данных 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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Пожалуйста, исправьте мое понимание ошибки. Я думаю, что эта ошибка возникает из-за того, что запись о клиенте и типе учетной записи не создается в БД, и, следовательно, когда учетная запись вставляется в БД, она не может найти идентификатор типа учетной записи, и поэтому возникает эта ошибка.




Да, если объекты с совпадающими идентификаторами отсутствуют, вы получите нарушение ограничения целостности.
Если вы хотите добиться каскадного создания связанных сущностей, вам следует добавить cascade к вашим реляционным сопоставлениям. Например:
@OneToOne(cascade = CascadeType.ALL...)
Но даже тогда, когда вы отправляете данные JSON с определенными идентификаторами, которых нет в БД, вы получите эту ошибку.
Трудно сказать, что не так, без кода, который выполняет сохранение, но похоже, что вы пытаетесь сохранить каскадный тип учетной записи с идентификатором, для которого уже установлено определенное значение. Вам нужно оставить его нулевым. Но тогда вопрос в том, хотите ли вы этого. Если тип учетной записи с этим идентификатором существует в БД, вам необходимо сначала получить его.
Я добавил cascade = CascadeType.ALL в оба столбца соединения (тип учетной записи и клиент) в классе учетной записи и снова попытался выполнить запрос POST, но он не удался с ошибкой «отдельный объект передан для сохранения: com.microservice.model.AccountType;»