Нарушение ограничений весной jpa при сохранении объектаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Нарушение ограничений весной jpa при сохранении объекта

Сообщение Anonymous »

В методеprocessOrder, когда я пытаюсь сохранить объект tacoOrder, появляется эта ошибка
jakarta.validation.ConstraintViolationException: Validation failed for classes [com.example.tacohouse.entities.Taco] during persist time for groups [jakarta.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='You must choose at least 1 ingredient', propertyPath=ingredients, rootBeanClass=class com.example.tacohouse.entities.Taco, messageTemplate='You must choose at least 1 ingredient'}

Я настроил журналы отладки и увидел, что объект, полученный из привязки формы в параметре метода, отлично работает и правильно включает тако с ингредиентами.
Это это метод ProcessOrder
@Transactional
@PostMapping("/current")
public String processOrder(@ModelAttribute("order") @Valid TacoOrder order, Errors errors,
@AuthenticationPrincipal User user, RedirectAttributes redirectAttributes) {
if(errors.hasErrors()){
return "orderForm";
}
order.setUser(user);
order.setPlacedAt(new Date());

log.info(" {} ", sessionScopedTacoOrderManager.getTacoOrder()); //fine
log.info(" {} ", order); //fine

TacoOrder tacoOrder = orderRepository.save(order); //problem in this

user.addTacoOrder(tacoOrder);
userRepository.save(user);

log.info("Order submitted: {}", tacoOrder);

return "redirect:/orders";
}


это последующие логи
2024-03-18 19:26:01.932 [http-nio-8080-exec-9] INFO c.e.t.controllers.OrderController -TacoOrder(id=94ef1789-4757-41db-8196-bf88117b498e, placedAt=Mon Mar 18 19:26:01 IST 2024, deliveryName=a, deliveryStreet=a, deliveryCity=a, deliveryState=a, deliveryZip=a, ccNumber=4417123456789113, ccExpiration=11/2024, ccCVV=111, tacos=[Taco(id=null, createdAt=Mon Mar 18 19:25:45 IST 2024, name=firstTaco, ingredients=[Ingredient(id=CHED, name=Cheddar, type=CHEESE)])])

2024-03-18 19:26:01.932 [http-nio-8080-exec-9] INFO c.e.t.controllers.OrderController - TacoOrder(id=94ef1789-4757-41db-8196-bf88117b498e, placedAt=Mon Mar 18 19:26:01 IST 2024, deliveryName=a, deliveryStreet=a, deliveryCity=a, deliveryState=a, deliveryZip=a, ccNumber=4417123456789113, ccExpiration=11/2024, ccCVV=111, tacos=[Taco(id=null, createdAt=Mon Mar 18 19:25:45 IST 2024, name=firstTaco, ingredients=[Ingredient(id=CHED, name=Cheddar, type=CHEESE)])])

2024-03-18 19:26:01.932 [http-nio-8080-exec-9] INFO c.e.t.controllers.OrderController - Order submitted: TacoOrder(id=94ef1789-4757-41db-8196-bf88117b498e, placedAt=2024-03-18 19:26:01.908, deliveryName=a, deliveryStreet=a, deliveryCity=a, deliveryState=a, deliveryZip=a, ccNumber=4417123456789113, ccExpiration=11/2024, ccCVV=111, tacos=[Taco(id=null, createdAt=null, name=null, ingredients=[])])

Согласно журналам, текущему сеансовому порядку и порядку из привязки формы, любой из них можно использовать, и они оба правильно заполнены.
Это метод обработки тако, если вам нужно
@PostMapping
public String processTaco(@Valid Taco taco,Errors errors) {
if(errors.hasErrors()){
return "designTaco";
}
taco.setCreatedAt(new Date());
TacoOrder tacoOrder = sessionScopedTacoOrderManager.getTacoOrder();
tacoOrder.addTaco(taco);
log.info("Processing taco: {}", taco);
return "redirect:/orders/current";
}

его журналы
2024-03-19 15:05:19.335 [http-nio-8080-exec-7] INFO c.e.t.c.DesignTacoController - Processing taco: Taco(id=null, createdAt=Tue Mar 19 15:05:19 IST 2024, name=Ansh Anand, ingredients=[Ingredient(id=CHED, name=Cheddar, type=CHEESE)])

Это объекты
@Data
@Entity
@Getter
@Setter
public class TacoOrder{
@Id //@GeneratedValue(strategy = GenerationType.IDENTITY)
private final String id = UUID.randomUUID().toString();
private Date placedAt;
@NotBlank(message = "Delivery name is required")
private String deliveryName;
@NotBlank
private String deliveryStreet;
@NotBlank(message = "City is required")
private String deliveryCity;
@NotBlank(message = "State is required")
private String deliveryState;
@NotBlank(message = "Zip Code is required")
private String deliveryZip;
@CreditCardNumber(message = "Invalid Credit Card Number")
private String ccNumber;
@Pattern(regexp = "^(0[1-9]|1[0-2])/20(2[3-9]|[3-9][0-9])$",message = "Must be of format MM/YYYY")
private String ccExpiration;
@NotNull
@Digits(integer=3, fraction=0, message="Invalid CVV")
private String ccCVV;
@ManyToOne
@ToString.Exclude
private User user;

@OneToMany(mappedBy = "tacoOrder", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List tacos = new ArrayList();
public void addTaco(Taco taco) {
taco.setTacoOrder(this);
this.tacos.add(taco);
}

}

@Data
@Entity
@NoArgsConstructor //if we make a cunstructor @data wont make a noArgConstructor iteelf, so we define it
public class Taco{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Date createdAt;
@NotBlank
@Size(min = 5, message = "Name must be at least 5 characters long")
private String name;

@ManyToMany
@JoinTable(
name = "ingredient_ref",
joinColumns = @JoinColumn(name = "taco_id"),
inverseJoinColumns = @JoinColumn(name = "ingredient_id"))
@NotNull
@Size(min=1, message="You must choose at least 1 ingredient")
private List ingredients = new ArrayList();

@ManyToOne
@JoinColumn(name = "taco_order_id")
@ToString.Exclude
private TacoOrder tacoOrder;

public Taco(Date createdAt, String name, List ingredients) {
this.createdAt = createdAt;
this.name = name;
this.ingredients = ingredients;
}
}

@Data
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED,force = true)
@RequiredArgsConstructor
public class Ingredient {
@Id
private final String id;
private final String name;
@Enumerated(EnumType.STRING)
private final Type type;

public enum Type {
WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE, EXTRA
}
}

Почему при сохранении tacoOrder список тако становится нулевым? (я удалил каскадирование в списке тако, чтобы проверить, не происходит ли что-то другое, при сохранении не выдавалось ошибок, поскольку не сохранялся подобъект тако, но в сохраненном TacoOrder не было тако в поле tacoList)
Почему метод save() обнуляет список тако объекта TacoOrder?
Я пытался сохранить tacoOrder и последующие тако. Но при сохранении мне выдавалась ошибка проверки, хотя такой ошибки проверки быть не должно, поскольку она не была пустой. Я думаю, что метод save() репозитория обнуляет список Taco объекта Taco Order.
Ошибка возникает, когда метод пытается сохранить tacoOrder в репозитории заказов.
Проблема в том, что jpa создает новый список тако с нулевыми записями вместо добавления списка тако, который в настоящее время присутствует в объекте TacoORder в базе данных.
Я не могу найти, где он на самом деле заставляет это делать
Вот как ингредиенты сохраняется на случай, если это поможет: (я предварительно загружаю базу данных с ингредиентами с помощью IngenceRepository перед запуском приложения)
@ModelAttribute
public void addIngredientsToModel(Model model){
Iterable tempo = ingredientRepository.findAll();
List ingredients = new ArrayList();
tempo.forEach(ingredients::add);
Ingredient.Type[] types = Ingredient.Type.values();
for(Ingredient.Type type: types){
model.addAttribute(type.toString().toLowerCase(),filterByType(ingredients , type));
}
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... ing-entity
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • JPA определить пользовательское сообщение об ошибке в нескольких столбцах уникальное нарушение ограничений
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки весной при сохранении объекта
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки весной при сохранении объекта
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки весной при сохранении объекта
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки весной при сохранении объекта
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»