Hibernate не позволяет сохранять данные с похожим идентификатором - PullRequest
0 голосов
/ 11 апреля 2020

Я учу весну и через несколько дней go я начал изучать Hibernate. У меня есть учебный проект, где мне нужно создать магазин с продуктами. Вот класс сущностей

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "cart")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cart {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")

    private int id;
    @Column(name = "quantity")
    private int quantity;
    @Column(name = "mask")
    private String mask;
    @Column(name = "price")
    private int price;

Итак, я создаю интерфейс

import org.springframework.data.jpa.repository.JpaRepository;

public interface CartRepository extends JpaRepository<Cart, Integer> {
}

и создаю контроллеры

@Autowired
    CartRepository cartList;

    @RequestMapping("/add-black-mask")
    public String addBlackMask() {
        cartList.save(new Cart(1, 1, "black", 3));

        return "masks/add-black-mask";
    }

    @RequestMapping("/add-build-mask")
    public String addBuildMask() {
        cartList.save(new Cart(2, 1, "build", 5));

        return "masks/add-build-mask";
    }


  @RequestMapping(value = "/save_product_to_cart")
    public ModelAndView saveProduct(@ModelAttribute(value = "cart")
                                            Cart cart, BindingResult result) {
        int index = Integer.parseInt(String.valueOf(cartList.count()));
        if (cart.getId() == 0) {
            cart.setId(index + 1);
            cartList.save(cart);
        } else {
            Cart cart1 = cartList.getOne(cart.getId());
            cart1.setMask(cart.getMask());
            cart1.setQuantity(cart.getQuantity());
            cart1.setPrice(cart.getPrice());
            cartList.save(cart1);
        }
        return new ModelAndView("redirect:/");
    }

Также есть некоторые другие контроллеры для просмотра, Thymeleaf et c, но это нормально. Моя проблема - когда я сохраняю свой продукт 1 раз - это нормально, но когда я сохраняю второй - это не сработало (я думаю, потому что я не могу сохранить 2 строки с одинаковым идентификатором) Так что, похоже, у меня есть уникальный идентификатор в моей таблице и это не может быть повторено. Вопрос - как я могу удалить уникальный идентификатор или изменить свой код в любом случае? Заранее спасибо!

ps Я читал здесь еще несколько тем, но мне это не помогло.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

когда вы используете GENERATIONTYPE.IDENTITY, вы просите hibernate, чтобы позволить базе данных обрабатывать идентификаторы для вас, вы не должны устанавливать это самостоятельно. Вы меняете значение идентификатора, просто создаете новый продукт, устанавливаете все поля и внутри контекста транзакции сохраняете свой продукт. Также всегда используйте упакованные версии примитивов для целей сериализации. (Long - это объект, но long - это примитив.) Вы можете погуглить и распаковать и узнать больше об этом.

0 голосов
/ 15 апреля 2020

Позвольте мне ответить на этот вопрос:
Прежде всего, использование аннотаций в качестве нашего метода конфигурации - это просто удобный метод вместо копирования бесконечного XML файла конфигурации.

Аннотация @Id наследуется от javax.persistence.Id ,, указывая, что поле элемента ниже является первичным ключом текущего объекта. Следовательно, ваш Hibernate и Spring Framework, а также вы можете сделать некоторые reflect работы на основе этой аннотации. для получения подробной информации, пожалуйста, проверьте javado c для Id

Аннотация @GeneratedValue предназначена для настройки способа приращения указанного столбца (поля). Например, при использовании Mysql, вы можете указать auto_increment в определении таблицы, чтобы сделать его самоинкрементным, а затем использовать

@GeneratedValue(strategy = GenerationType.IDENTITY)

в коде Java, чтобы обозначить, что вы также подтвердили использовать эту стратегию на стороне сервера базы данных. Кроме того, вы можете изменить значение в этой аннотации для соответствия различным требованиям.

1. Определить последовательность в базе данных

Например, Oracle должен использовать sequence в качестве метода приращения, скажем, мы создаем последовательность в Oracle:

create sequence oracle_seq;

2. См. Последовательность базы данных

Теперь, когда у нас есть последовательность в базе данных, но нам нужно установить sh отношение между Java и БД, используя @SequenceGenerator:

@SequenceGenerator(name="seq",sequenceName="oracle_seq")

sequenceName - настоящее имя последовательности в Oracle, name - это то, что вы хотите назвать в Java. Вам нужно указать sequenceName, если он отличается от name, в противном случае просто используйте name. Я обычно игнорирую sequenceName, чтобы сэкономить свое время.

3. Используйте последовательность в Java

Наконец, пришло время использовать эту последовательность в Java. Просто добавьте @GeneratedValue:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")

Поле generator указывает, какой генератор последовательности вы хотите использовать. Обратите внимание, что это не реальное имя последовательности в БД, а имя, которое вы указали в name поле SequenceGenerator.

4. Complete

Таким образом, полная версия должна выглядеть следующим образом:

public class Cart
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer id;
}

Теперь начните использовать эти аннотации, чтобы упростить разработку JavaWeb.

Кроме того, я хотел бы, чтобы вы поняли все 4 способа генерации идентификаторов в спящем режиме. Вы можете читать в свободное время

  1. GenerationType.AUTO
  2. GenerationType.IDENTITY (ваш случай)
  3. GenerationType.SEQUENCE
  4. GenerationType .TABLE {Редко используется в наши дни}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...