![](/img/trans.png)
[英]Spring boot, how to insert a new record with in a table with an EmbeddedId
[英]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.