我已经创建了一个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已经存在或类似的错误。相反,尝试持久化的对象的详细信息会更新为已经可用的主键数据。复合主键实体也会发生同样的情况。
我这边有什么问题吗?或者我应该做进一步的配置吗?
先谢了。
3条答案
按热度按时间bzzcjhmw1#
如果您正在使用
CrudRepository
中的save
方法,那么您需要了解,如果id为的实体(主键)null,然后它将生成一个新ID(根据实现自动递增)并保存记录。但是,如果在save
方法中传递了已经存在于数据库中的具有id的实体,那么它将更新该实体。请看一下这个article。holgip5t2#
只需使用.insert()函数代替.保存()函数
ia2d9nvy3#
问题已经有了一个可接受的答案,但还有另一种方法可以处理此问题。
检查记录是否已存在,然后继续。