[英]Can an entity be updated instead of being inserted using spring-data-jpa when entity ID is not known without issuing a query?
我們有一個使用Hibernate實現的Spring Boot / Data-JPA(1.3.3.RELEASE)應用程序,其中讀取CSV文件並將其插入到名為FIRE_CSV_UPLOAD的數據庫表中。 對於已經存在的記錄,我們只需對其進行更新。 我們通過查詢唯一鍵(三列的組合)來檢索記錄ID,但是這種方法對於CSV文件中的數千條記錄效率不高。
我的問題是如何在不查詢表的唯一鍵的情況下更新記錄? 如果我不查詢ID,那么將插入記錄而不是更新記錄。
我知道一種檢索所有記錄並將其唯一鍵和ID對存儲在Map中的方法。 非常感謝任何其他建議。 代碼如下
注意 :為簡潔起見,將它們最小化。
@Entity
@Table(name = "FIRE_CSV_UPLOAD",
uniqueConstraints={@UniqueConstraint(columnNames = {"account_number" , "account_type", "bank_client_id"})})
public class FireCsv {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@NotNull
@Column(name="account_number")
private String accountNumber;
@NotNull
@Column(name="account_type")
private String accountType;
@NotNull
@Column(name="bank_client_id")
private String bankClientIdNumber;
...
other fields/getters/setters
}
-
public interface FireCsvRepository extends JpaRepository<FireCsv, Long> {
@Query("select u from FireCsv u where u.accountNumber = :accountNumber and u.accountType = :accountType and u.bankClientIdNumber = :bankClientIdNumber ")
FireCsv findRecord(@Param("accountNumber") String accountNumber,
@Param("accountType") String accountType,
@Param("bankClientIdNumber") String bankClientIdNumber);
}
-
@Service
public class FireCsvServiceImpl implements FireCsvService {
other fields/methods
...
@Override
@Transactional
public FireCsv save(final FireCsv fireCsv) {
FireCsv existingFireCsv = fireCsvRepository.findRecord(fireCsv.getAccountNumber(), fireCsv.getAccountType(), fireCsv.getBankClientIdNumber());
// If record exist then mark as update, if not as insert
if (existingFireCsv != null) {
fireCsv.setId(existingFireCsv.getId());
fireCsv.setRecordStatus(CSVUploadRecordStatus.CSV_UPDATE.getStatus());
}
else {
fireCsv.setRecordStatus(CSVUploadRecordStatus.CSV_INSERT.getStatus());
}
fireCsv.setRecordStatusDate(new java.sql.Timestamp(new Date().getTime()));
return fireCsvRepository.save(fireCsv);
}
}
在決定進行更新或插入之前,您必須閱讀,我認為沒有辦法解決。
為了使速度更快,您應該使用三列“ account_number”,“ account_type”,“ bank_client_id”向數據庫添加索引。
或者,您可以嘗試使用@IdClass使用組合ID,如tutorial-jpa-composite-primary-key中所示。JPA提供程序應該為此自動創建索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.