我有一个以下格式的表格
Customer:
ID PK
value1
value2
address
我对 value1 和 value2 有唯一约束。
保存/更新时我将没有 ID 的价值
所以这是我更新客户的服务类代码:
@Transactional
public void saveCustomer(String value1,String value2, String address) {
Customer customer = customerRepository.findByValue1AndValue2(value1,value2).orElse(new Customer());
customer.setValue1(value1);
customer.setValue2(value2);
customer.setAddress(address);
customerRepository.save(customer);
}
我收到“无法在对象错误中插入重复的键行。”
当我使用 findByValue1AndValue2 获取客户对象时,它会有 id 或 rect 吗?所以它应该更新而不是插入
添加我的客户类别:
@Entity
@Table(name = "customer")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Customer{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name="value1")
private String value1;
@Column(name="value2")
private String value2;
@Column(name="address")
private String address;
@CreatedDate
@Column(name="created_date", nullable = false, updatable = false)
private Date created_date;
@LastModifiedDate
@Column(name="updated_date")
private Date updated_date;
}
我添加了注释@EnableTransactionManagement 有什么具体需要做的吗
请帮我解决这个问题。
提前致谢
问题在于
orElse(new Customer())
。即使当Optional非空时,orElse()
方法也总是调用提供的函数。在这种情况下,每次都会创建一个新对象,并且由于该方法是交互的,因此该对象将持续存在。或者,您可以使用 orElseGet()
,它仅在存在Optional 值时才执行Supplier 方法。