Spring boot: нарушение ограничения ссылочной целостности - PullRequest
0 голосов
/ 03 марта 2019

Здравствуйте, я столкнулся с этой ошибкой, и ни одно из найденных решений не сработало.У меня есть объект корзины:

@Data
@Entity
public class Cart {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String status;
  @ManyToOne(cascade = CascadeType.MERGE)
  @JoinColumn(name = "usr_id", nullable = false)
  private User usr;
  @ElementCollection(targetClass=String.class)
  private List<String> productsBarcode = new ArrayList<>();
  private long nutritional_score;
}

и объект пользователя

@Entity
@Data
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String firstname;
    private String lastname;
    private String email;
    private String phone;
    @JsonIgnore
    @OneToMany(mappedBy = "id",cascade=CascadeType.ALL)
    private List<Cart> carts = new ArrayList<Cart>();
}

Когда я пытаюсь передать запрос POST со следующим JSON:

{
  "status": "in-progress",
  "usr": {
    "id": 1,
    "firstname": "jhon",
    "lastname": "koer",
    "email": "ero@fk.fr",
    "phone": "078542163"
  },
  "productsBarcode": [
    "3029330003533",
    "3029330003533"
  ]
}

Но я получаю эту ошибку:

org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: 
"FK8TNAV1OMIP1EBGI23DBBO8B8T: PUBLIC.CART FOREIGN KEY(USR_ID) REFERENCES PUBLIC.USER(ID) (100)"; SQL statement: 
insert into cart (id, nutritional_score, status, usr_id) values (null, ?, ?, ?) [23506-197]

Как мне это исправить, пожалуйста?

1 Ответ

0 голосов
/ 04 марта 2019

Вы получаете DataIntegrityViolationException, скорее всего, потому что вы можете ссылаться на пользователя, которого нет в базе данных:

Вы можете увидеть сценарий в тесте ниже:

@Test(expected = DataIntegrityViolationException.class)
  public void saveCartWithNonExistentUserMustThrowIntegrityException() {
    // We create a bean to a user that has not been inserted on database
    User user = new User(4815L, "Alfonso", "Cuaron", "aq@academy.com");

    Cart cart = new Cart("in-progress", user, Arrays.asList("1234", "1234"), 10);
    Cart cartSaved = cartRepository.save(cart); // Exception is thrown
  }

  @Test
  public void saveCartWithExistentUserMustSucceed() {
    User user = new User("Alfonso", "Cuaron", "aq@academy.com");
    // We ensure user is persisted on database
    User existentUser = userRepository.save(user);
    // Now User.id reference exist in database
    Cart cart = new Cart("in-progress", existentUser, Arrays.asList("1234", "1234"), 10);
    Cart cartSaved = cartRepository.save(cart);

    Assert.assertNull(cartSaved.getId()); // Cart is persisted
  }
...