maven 正在Sping Boot 中更新主键值

avwztpqn  于 2023-03-01  发布在  Maven
关注(0)|答案(3)|浏览(144)

我已经创建了一个maven项目使用MySQL数据库的Spring Boot。
我有两个实体类,其中一个实体类有主键,另一个实体类有复合主键。
Customer.java(Has a primary key)

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String address;
    private String gstin;
    private String phoneNumber;

    @CreatedDate
    private Date createdDate;

    @LastModifiedDate
    private Date updatedDate;

//Getters and setters
}

ItemId.java (Idclass for Item.java)

public class ItemId implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private Long id;

    private Long billNo;
//Getters and Setters
}

Item.java (Has a composite primary key)

@Entity
@IdClass(ItemId.class)
public class Item {
    @Id
    private Long id;

    @Id
    private Long billNo;

    private String particular;

    private String hsnCode;

    private Double quantity;

    private String quantityUnit;

    private Double rate;

    private String rateUnit;

    private Double price;

    @CreatedDate
    private Date createdDate;

    @LastModifiedDate
    private Date updatedDate;
//Getters and setters
}

这里的问题是,当一个实体对象通过存储库对象持久化时,其id已经存在于表中,Spring boot JPA不会抛出主键id已经存在或类似的错误。相反,尝试持久化的对象的详细信息会更新为已经可用的主键数据。复合主键实体也会发生同样的情况。
我这边有什么问题吗?或者我应该做进一步的配置吗?
先谢了。

bzzcjhmw

bzzcjhmw1#

如果您正在使用CrudRepository中的save方法,那么您需要了解,如果id为的实体(主键)null,然后它将生成一个新ID(根据实现自动递增)并保存记录。但是,如果在save方法中传递了已经存在于数据库中的具有id的实体,那么它将更新该实体。请看一下这个article

holgip5t

holgip5t2#

只需使用.insert()函数代替.保存()函数

ia2d9nvy

ia2d9nvy3#

问题已经有了一个可接受的答案,但还有另一种方法可以处理此问题。
检查记录是否已存在,然后继续。

if(repository.existsById(dto.getId())){
        //throw exception
    }else{
        //perform save operation
    }

相关问题