Проблема с Map

 
 
 
Сообщения:146
Пишу что-то вроде магазина со Spring и Hibernate.
В корзину при изменении количества товара добавляется новое значение со старым ключом:
basket.getProducts().put(productService.findByName(prodName), Double.valueOf(newQuantity));

basket.getProducts() - возвращает карту, где ключ - Product, а значение - его количество в Double.
Перезагрузил метод equals для класса Product, чтобы продукты с одним именем считались одним и тем же:
@Override
	public boolean equals(Object other)
    {
return this.name.equals(((Product)other).name);
    }

Но почему-то basket.getProducts().put(productService.findByName(prodName), Double.valueOf(newQuantity)); не перезаписывает старое значение, а добавляет новое. К примеру, получилось две колбасы в корзине с разным количеством:
Колбаса 1.0
Колбаса 3.0
Подскажите, куда смотреть? Где я затупил?
 
 
Сообщения:781
equals, hashCode, compareTo.
забыл или переписал коряво.
 
 
Сообщения:146
То есть Map использует для сравнения все три метода?
 
 
Сообщения:781
разные коллекции по разному. например HashSet и HashMap используют hashCode для грубого поиска, а потом equals для точного. и если там накосячить, то точный поиск будет производиться не там и соответственно ничего найти не удастся.
есть правило: переписал одну из них - перепиши остальные. ну разве что у тебя они не Comparable.
погугли, на эту тему есть много хороших статей.
 
 
Сообщения:146
windruf:
разные коллекции по разному. например HashSet и HashMap используют hashCode для грубого поиска, а потом equals для точного. и если там накосячить, то точный поиск будет производиться не там и соответственно ничего найти не удастся.
есть правило: переписал одну из них - перепиши остальные. ну разве что у тебя они не Comparable.
погугли, на эту тему есть много хороших статей.

Спасибо, переопределил hashCode(), проблема ушла.
Есть вопрос по работе Hibernate, связанный с этим же проектом. Я не хочу подымать отдельную тему.
Есть страница, где пользователь может создать корзину покупок. Есть сессионные атрибуты - сама корзина и ее содержимое.
@ModelAttribute("basket")
	public Basket newBasket()
	{
		return new Basket();
		
	   }
	
	@ModelAttribute(value = "allProductsOfBasket")
	public Map<Product, Double> mapProducts(@ModelAttribute("basket") Basket basket) {
		if (basket.getProducts()==null) {
			Map<Product, Double> products = new HashMap<>();
			basket.setProducts(products);
		}
		return basket.getProducts();
		}

Когда пользователь забивает корзину нужными товарами, он может нажать кнопку "Сохранить". На контроллере вызовется метод:
@PostMapping("/save")
	public String save(@ModelAttribute("basket") Basket basket)  {
		basketService.save(basket);
		return "redirect:/";
		
	}

Корзина сохраняется в базе данных.
Теперь если пользователь попробует создать новую корзину покупок, не завершая сессию, новая корзина будет содержать все предыдущие товары. При сохранении ее, почему-то из старой корзины в базе данных удаляются все товары. Я вижу в консоли такое сообщение:
Hibernate: delete from basket_products where Basket_id=?
Hibernate: insert into basket_products (Basket_id, product_id, amount) values (?, ?, ?)
Hibernate: insert into basket_products (Basket_id, product_id, amount) values (?, ?, ?)
Hibernate: insert into basket_products (Basket_id, product_id, amount) values (?, ?, ?)

И я вот не могу понять - почему Hibernate при сохранении второй корзины сначала удаляет содержимое первой?
 
 
Сообщения:146
Сохранял с использованием метода Session.save(). Когда вместо этого стал использовать Session.merge(), прежняя корзина содержит все заказанные товары.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет