簡體   English   中英

如果在不發出查詢的情況下未知實體ID的情況下,是否可以更新實體而不是使用spring-data-jpa插入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM