java - Hibernate不允许保存具有相似id的数据

标签 java postgresql hibernate spring-boot

我正在学习 Spring,几天前我开始学习 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> {
}

并创建 Controller

@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:/");
    }

此外,还有一些其他的 View Controller ,Thymeleaf 等,但还可以。我的问题是 - 当我保存我的产品 1 次时 - 可以,但是当我保存第二次时 - 它不起作用(我想是因为我无法保存具有相似 ID 的 2 行)所以看来我的表中有唯一的 ID 并且它不能重复。问题是 - 如何删除唯一 ID 或以任何方式更改我的代码?提前致谢!

附:我在这里阅读了一些其他主题,但这对我没有帮助。

最佳答案

当您使用GENERATIONTYPE.IDENTITY时您要求 hibernate 让数据库为您处理 Id,您不应该自己设置它。您正在更改 id 的值,只需创建一个新产品,设置所有字段并在事务上下文中保存您的产品。还始终使用原语的包装版本来实现序列化目的。 (Long 是一个对象,但 long 是一个原语。)您可以通过 google 装箱和拆箱了解更多相关信息。

关于java - Hibernate不允许保存具有相似id的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61148773/

相关文章:

java - AbstractTableModel 中的 JTable 未显示

sql - 根据当前行的条件选择前几行

python - 为什么 Flask Migrations 没有检测到字段的长度变化?

hibernate - 如何衡量 hibernate 状态?

java - 服务器启动时的 hibernate 验证不检查列长度

java - 为什么我的 Hibernate 实体中的字段为空?

java - org.apache.http.client. Fluent 损坏 URL

java - 我正在制作一个带有 swing 的计算器,但按钮都搞乱了

java - 如何将 3rd 方 JAR 打包到 EJB jar 中?

ruby-on-rails - 我的 ubuntu 用户无法访问开发用户在 postgres for rails 中创建的数据库