簡體   English   中英

只需更新實體而不在 spring 引導項目中的數據庫中插入新記錄

[英]Just update entity and not insert new record in database in spring boot project

我有一種方法可以每 10 秒檢查一次數據更改,並且我希望在檢查數據是否更改后只是為了更新以前的數據,而不是在數據庫中插入新記錄。 我的意思是每 10 秒將新記錄插入到數據庫中,最后,我的 API 看起來像這樣:


[
    {
        "id": 1,
        "provinceState": "Guadeloupe",
        "countryRegion": "France",
        "lat": "16.265",
        "lon": "-61.551",
        "latestTotalCases": 9302,
        "diffFromPrevDay": 0
    },
    
{
        "id": 2,
        "provinceState": "French Polynesia",
        "countryRegion": "France",
        "lat": "-17.6797",
        "lon": "149.4068",
        "latestTotalCases": 18263,
        "diffFromPrevDay": 0
    } 
]

然后 10 秒后,我的 API 看起來像這樣。

[
    {
        "id": 1,
        "provinceState": "Guadeloupe",
        "countryRegion": "France",
        "lat": "16.265",
        "lon": "-61.551",
        "latestTotalCases": 9302,
        "diffFromPrevDay": 0
    },
    
{
        "id": 2,
        "provinceState": "French Polynesia",
        "countryRegion": "France",
        "lat": "-17.6797",
        "lon": "149.4068",
        "latestTotalCases": 18263,
        "diffFromPrevDay": 0
    },
{
        "id": 3,
        "provinceState": "Guadeloupe",
        "countryRegion": "France",
        "lat": "16.265",
        "lon": "-61.551",
        "latestTotalCases": 9302,
        "diffFromPrevDay": 0
    },
    
{
        "id": 4,
        "provinceState": "French Polynesia",
        "countryRegion": "France",
        "lat": "-17.6797",
        "lon": "149.4068",
        "latestTotalCases": 18263,
        "diffFromPrevDay": 0
    } 
]

任何人都可以幫忙嗎?

這是我的代碼。

實體


@Entity
public class ApplicationEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true)
    private Long id;

    private String provinceState;
    private String countryRegion;
    private String lat;
    private String lon;
    private int latestTotalCases;
    private int diffFromPrevDay;



    public ApplicationEntity() {
    }

    public ApplicationEntity(Long id, String provinceState, String countryRegion, String lat, String lon, int latestTotalCases, int diffFromPrevDay) {
        this.id = id;
        this.provinceState = provinceState;
        this.countryRegion = countryRegion;
        this.lat = lat;
        this.lon = lon;
        this.latestTotalCases = latestTotalCases;
        this.diffFromPrevDay = diffFromPrevDay;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public int getLatestTotalCases() {
        return latestTotalCases;
    }

    public void setLatestTotalCases(int latestTotalCases) {
        this.latestTotalCases = latestTotalCases;
    }

    public int getDiffFromPrevDay() {
        return diffFromPrevDay;
    }

    public void setDiffFromPrevDay(int diffFromPrevDay) {
        this.diffFromPrevDay = diffFromPrevDay;
    }

    public String getProvinceState() {
        return provinceState;
    }

    public void setProvinceState(String provinceState) {
        this.provinceState = provinceState;
    }

    public String getCountryRegion() {
        return countryRegion;
    }

    public void setCountryRegion(String countryRegion) {
        this.countryRegion = countryRegion;
    }

    public String getLat() {
        return lat;
    }

    public void setLat(String lat) {
        this.lat = lat;
    }

    public String getLon() {
        return lon;
    }

    public void setLon(String lon) {
        this.lon = lon;
    }

    @Override
    public String toString() {
        return "ApplicationEntity{" +
                ", provinceState='" + provinceState + '\'' +
                ", countryRegion='" + countryRegion + '\'' +
                ", lat=" + lat +
                ", lon=" + lon +
                '}';
    }
}

存儲庫

public interface ApplicationRepository extends JpaRepository<ApplicationEntity, Long> {

    Optional<ApplicationEntity> findEntityById(Long id);
}

服務


@Service
public class ApplicationService extends ServiceAbstractionLayer {

    private final ApplicationRepository applicationRepository;
    private List<ApplicationEntity> allStats = new ArrayList<>();

    @Autowired
    public ApplicationService(ApplicationRepository applicationRepository) {
        this.applicationRepository = applicationRepository;
    }

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    public void addEntity(ApplicationEntity entities) {
        applicationRepository.save(entities);
    }


    public List<ApplicationEntity> getEntities() {
        return applicationRepository.findAll();
    }

    public void deleteAll() {
        applicationRepository.deleteAll();
    }

    public ApplicationEntity findEmployeeById(Long id) {
        return applicationRepository.findEntityById(id).orElseThrow(() -> new ApiRequestException("Case by id " + id + " was not found!"));
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Scheduled(cron = "*/10 * * * * *")
    @PostConstruct
    @Override
    public void fetchConfirmedData() throws IOException, InterruptedException {
        List<ApplicationEntity> newStats = new ArrayList<>();
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(Constants.URL_CONFIRMED)).build();

        HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
        StringReader csvBodyReader = new StringReader(httpResponse.body());
        Iterable<CSVRecord> records = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(csvBodyReader);

        for (CSVRecord record : records) {
            ApplicationEntity locationStats = new ApplicationEntity();
            for (long j = 0; j <= newStats.size(); j++)
                locationStats.setId(j);
            locationStats.setProvinceState(record.get("Province/State"));
            locationStats.setCountryRegion(record.get("Country/Region"));
            locationStats.setLat(record.get("Lat"));
            locationStats.setLon(record.get("Long"));
            int latestCases = Integer.parseInt(record.get(record.size() - 1));
            int prevDayCases = Integer.parseInt(record.get(record.size() - 2));

            locationStats.setLatestTotalCases(latestCases);
            locationStats.setDiffFromPrevDay(latestCases - prevDayCases);
            newStats.add(locationStats);
            addEntity(locationStats);
        }

        this.allStats = newStats;

    }

    public List<ApplicationEntity> getAllStats() {
        return allStats;
    }


    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory);
    }

Controller

@RestController
public class ApplicationController {

    private final ApplicationService applicationService;

    @Autowired
    public ApplicationController(ApplicationService applicationService) {
        this.applicationService = applicationService;
    }

    @GetMapping("/all")
    public ResponseEntity<List<ApplicationEntity>> getAlldb() {
        List<ApplicationEntity> allStats = applicationService.getEntities();
        return new ResponseEntity<>(allStats, HttpStatus.OK);
    }

    @GetMapping("/all/{id}")
    public ResponseEntity<ApplicationEntity> getEntityById(@PathVariable("id") Long id) {
        ApplicationEntity entity = applicationService.findEmployeeById(id);
        return new ResponseEntity<>(entity, HttpStatus.OK);
    }

    @DeleteMapping("/delete/all")
    public ResponseEntity<?> deleteAllEntities() {
        applicationService.deleteAll();
        return new ResponseEntity<>(HttpStatus.OK);
    }

}

主class

@EnableScheduling
@EnableTransactionManagement
@SpringBootApplication
public class Covid19RestApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(Covid19RestApiApplication.class, args);
    }

}

如果您手動分配實體 ID,就像您在fetchConfirmedData()方法中所做的那樣,您應該嘗試從ApplicationEntity.id中刪除@GeneratedValue(strategy = GenerationType.IDENTITY)注釋。

我猜您以錯誤的方式在 id 上使用注釋。 我的意思是,當一個 id 始終是唯一的時,為什么你需要在你的 ID 中定義@Column(unique = true)

因此,請嘗試刪除該行,或將其更改為:

@Column(name = "name_of_id_column_in_your_db")

並讓我們知道它是否有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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