Spring JPA save() 插入而不是更新

问题描述 投票:0回答:1

我有一个以下格式的表格

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 有什么具体需要做的吗

请帮我解决这个问题。

提前致谢

spring spring-boot spring-data-jpa
1个回答
0
投票

问题在于

orElse(new Customer())
。即使当Optional非空时,
orElse()
方法也总是调用提供的函数。在这种情况下,每次都会创建一个新对象,并且由于该方法是交互的,因此该对象将持续存在。或者,您可以使用
orElseGet()
,它仅在存在Optional 值时才执行Supplier 方法。

© www.soinside.com 2019 - 2024. All rights reserved.