如何避免从JPA实体保存截断的数据

huangapple go评论112阅读模式
英文:

How to avoid saving truncated data from JPA entity

问题

I am trying to save a bunch of data from two different entities named auditor_stamp_duty_report and deed_of_assignment. These 2 entities share a one to one and join table relationship. When I try to persist data from postman using the post method, only data from one entity gets saved into the database. The data for the other entity gets truncated.

Here is my entity classes;

  1. import com.fasterxml.jackson.annotation.JsonIgnore;
  2. import lombok.Data;
  3. import javax.persistence.*;
  4. import java.io.Serializable;
  5. import java.time.LocalDate;
  6. @Data
  7. @Entity
  8. @Table(name="auditor_stamp_duty_report")
  9. public class AuditorStampDutyReport implements Serializable {
  10. @Id
  11. @GeneratedValue(strategy = GenerationType.IDENTITY)
  12. @Column(name = "id")
  13. private Long id;
  14. @JsonIgnore
  15. @ManyToOne
  16. @JoinColumn(name = "id_of_tax_payer_organization", referencedColumnName = "id")
  17. private Organization organization;
  18. @Column(name = "tin_of_tax_payer_organization")
  19. private Long tin_of_tax_payer_organization;
  20. @Column(name = "period_covered")
  21. private String period_covered;
  22. @Column(name = "date_of_transaction")
  23. private LocalDate date_of_transaction;
  24. @JoinColumn(name = "duty_payer")
  25. private String duty_payer;
  26. @Column(name = "tin_of_duty_payer")
  27. private Long tin_of_duty_payer;
  28. @Column(name = "address_of_duty_payer")
  29. private String address_of_duty_payer;
  30. @JsonIgnore
  31. @ManyToOne
  32. @JoinColumn(name = "instrument_id", referencedColumnName = "id")
  33. private Instruments instruments;
  34. @Column(name = "assessment_number")
  35. private Long assessment_number;
  36. @Column(name = "receipt_number")
  37. private String receipt_number;
  38. @Column(name = "consideration")
  39. private Double consideration;
  40. @Column(name = "rate")
  41. private Double rate;
  42. @Column(name = "amount_payable")
  43. private Double amount_payable;
  44. @Column(name = "amount_paid")
  45. private Double amount_paid;
  46. @Column(name = "balance")
  47. private Double balance;
  48. @Column(name = "penalty")
  49. private Double penalty;
  50. @Column(name = "outstanding")
  51. private Double outstanding;
  52. @Column(name = "remarks")
  53. private String remarks;
  54. @Column(name="amount_recoverable")
  55. private Double amount_recoverable;
  56. @Column(name="date_of_payment")
  57. private LocalDate date_of_payment;
  58. @JsonIgnore
  59. @ManyToOne
  60. @JoinColumn(name = "user_profile_id", referencedColumnName = "id")
  61. private UserProfile userProfile;
  62. @OneToOne
  63. @JoinTable(
  64. name="auditor_stamp_duty_report_deed_of_assignment",
  65. joinColumns = @JoinColumn(name="auditor_stamp_duty_report_id", referencedColumnName = "id"),
  66. inverseJoinColumns = @JoinColumn(name="deed_of_assignment_id", referencedColumnName = "id")
  67. )
  68. private DeedOfAssignment deed_of_assignment_id;
  69. }
  70. //second entity
  71. package com.oasis.firsbacklogbackend.entity;
  72. import lombok.Data;
  73. import javax.persistence.*;
  74. import java.io.Serializable;
  75. import java.util.List;
  76. @Data
  77. @Entity
  78. @Table(name = "deed_of_assignment")
  79. public class DeedOfAssignment implements Serializable {
  80. @Id
  81. @GeneratedValue(strategy = GenerationType.IDENTITY)
  82. @Column(name="id")
  83. private Long id;
  84. @ManyToOne
  85. @JoinColumn(name="state_id", referencedColumnName="id")
  86. private State state;
  87. @ManyToOne
  88. @JoinColumn(name="lga_id", referencedColumnName = "id")
  89. private Lga lga;
  90. @Column(name="ward")
  91. private Long ward;
  92. @Column(name="description_of_location")
  93. private String description_of_location;
  94. }

also look at my dto layer which I am using to transfer data for both entities below:

  1. import lombok.Data;
  2. import java.time.LocalDate;
  3. @Data
  4. public class AuditorStampDutyReportDto {
  5. private Long id;
  6. private Long id_of_tax_payer_organization;
  7. private String duty_payer;
  8. private Long tin_of_tax_payer_organization;
  9. private String period_covered;
  10. private LocalDate date_of_transaction;
  11. private Long tin_of_duty_payer;
  12. private String address_of_duty_payer;
  13. private Long instrument_id;
  14. private Long assessment_number;
  15. private String receipt_number;
  16. private Double consideration;
  17. private Double rate;
  18. private Double amount_payable;
  19. private Double amount_paid;
  20. private Double balance;
  21. private Double penalty;
  22. private LocalDate date_of_payment;
  23. private Double amount_recoverable;
  24. private Double outstanding;
  25. private String remarks;
  26. private Long user_profile_id;
  27. private Long deed_of_assignment_id;
  28. private Long state_id;
  29. private Long lga_id;
  30. private Long ward;
  31. private String description_of_location;
  32. }

here is the service

  1. @Data
  2. @Service
  3. public class AuditorStampDutyReportService {
  4. private Logger logger = Logger.getLogger(AuditorStampDutyReportService.class.getName());
  5. @Autowired
  6. private BanksRepository banksRepository;
  7. @Autowired
  8. private AuditorStampDutyReportRepository auditorStampDutyReportRepository;
  9. @Autowired
  10. private OrganizationRepository organizationRepository;
  11. @Autowired
  12. private LgaRepository lgaRepository;
  13. @Autowired
  14. private StateRepository stateRepository;
  15. @Autowired
  16. private InstrumentsRepository instrumentsRepository;
  17. @Autowired
  18. private DeedOfAssignmentRepository deedOfAssignmentRepository;
  19. @Autowired
  20. private UserProfileRepository userProfileRepository;
  21. public AuditorStampDutyReport dtoToEntity (AuditorStampDutyReportDto dto){
  22. AuditorStampDutyReport report = new AuditorStampDutyReport();
  23. report.setId(dto.getId());
  24. Organization organization = organizationRepository.findById(dto.getId_of_tax_payer_organization()).orElse(null);
  25. report.setOrganization(organization);
  26. report.setTin_of_tax_payer_organization(dto.getTin_of_tax_payer_organization());
  27. report.setDate_of_transaction(dto.getDate_of_transaction());
  28. report.setPeriod_covered(dto.getPeriod_covered());
  29. report.setDuty_payer(dto.getDuty_payer());
  30. report.setTin_of_duty_payer(dto.getTin_of_duty_payer());
  31. report.setAddress_of_duty_payer(dto.getAddress_of_duty_payer());
  32. Instruments instruments = instrumentsRepository.findById(dto.getInstrument_id()).orElse(null);
  33. report.setInstruments(instruments);
  34. report.setAssessment_number(dto.getAssessment_number());
  35. report.setReceipt_number(dto.getReceipt_number());
  36. report.setConsideration(dto.getConsideration());
  37. report.setRate(dto.getRate());
  38. report.setAmount_payable(dto.getAmount_payable());
  39. report.setAmount_paid(dto.getAmount_paid());
  40. report.setBalance(dto.getBalance());
  41. report.setPenalty(dto.getPenalty());
  42. report.setDate_of_payment(dto.getDate_of_payment());
  43. report.setAmount_recoverable(dto.getAmount_recoverable());
  44. report.setOutstanding(dto.getOutstanding());
  45. report.setRemarks(dto.getRemarks());
  46. UserProfile userProfile = userProfileRepository.findById(dto.getUser_profile_id()).orElse(null);
  47. report.setUserProfile(userProfile);
  48. if(dto.getDeed_of_assignment_id()!=null && dto.getDeed_of_assignment_id() > 0) {
  49. DeedOfAssignment deedOfAssignment = deedOfAssignmentRepository.findById(dto.getDeed_of_assignment_id()).orElse(null);
  50. if (deedOfAssignment != null) {
  51. report.setDeed_of_assignment_id(deedOf
  52. <details>
  53. <summary>英文:</summary>
  54. I am trying to save a bunch of data from two different entities named auditor_stamp_duty_report and deed_of assignment. These 2 entities share a one to one and join table relationship. When I try to persist data from postman using the post method, only data from one entity gets saved into the database. The data for the other entity gets truncated.
  55. Here is my entity classes;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;

@Data
@Entity
@Table(name="auditor_stamp_duty_report")
public class AuditorStampDutyReport implements Serializable {

  1. @Id
  2. @GeneratedValue(strategy = GenerationType.IDENTITY)
  3. @Column(name = &quot;id&quot;)
  4. private Long id;
  5. @JsonIgnore
  6. @ManyToOne
  7. @JoinColumn(name = &quot;id_of_tax_payer_organization&quot;, referencedColumnName = &quot;id&quot;)
  8. private Organization organization;
  9. @Column(name = &quot;tin_of_tax_payer_organization&quot;)
  10. private Long tin_of_tax_payer_organization;
  11. @Column(name = &quot;period_covered&quot;)
  12. private String period_covered;
  13. @Column(name = &quot;date_of_transaction&quot;)
  14. private LocalDate date_of_transaction;
  15. @JoinColumn(name = &quot;duty_payer&quot;)
  16. private String duty_payer;
  17. @Column(name = &quot;tin_of_duty_payer&quot;)
  18. private Long tin_of_duty_payer;
  19. @Column(name = &quot;address_of_duty_payer&quot;)
  20. private String address_of_duty_payer;
  21. @JsonIgnore
  22. @ManyToOne
  23. @JoinColumn(name = &quot;instrument_id&quot;, referencedColumnName = &quot;id&quot;)
  24. private Instruments instruments;
  25. @Column(name = &quot;assessment_number&quot;)
  26. private Long assessment_number;
  27. @Column(name = &quot;receipt_number&quot;)
  28. private String receipt_number;
  29. @Column(name = &quot;consideration&quot;)
  30. private Double consideration;
  31. @Column(name = &quot;rate&quot;)
  32. private Double rate;
  33. @Column(name = &quot;amount_payable&quot;)
  34. private Double amount_payable;
  35. @Column(name = &quot;amount_paid&quot;)
  36. private Double amount_paid;
  37. @Column(name = &quot;balance&quot;)
  38. private Double balance;
  39. @Column(name = &quot;penalty&quot;)
  40. private Double penalty;
  41. @Column(name = &quot;outstanding&quot;)
  42. private Double outstanding;
  43. @Column(name = &quot;remarks&quot;)
  44. private String remarks;
  45. @Column(name=&quot;amount_recoverable&quot;)
  46. private Double amount_recoverable;
  47. @Column(name=&quot;date_of_payment&quot;)
  48. private LocalDate date_of_payment;
  49. @JsonIgnore
  50. @ManyToOne
  51. @JoinColumn(name = &quot;user_profile_id&quot;, referencedColumnName = &quot;id&quot;)
  52. private UserProfile userProfile;
  53. @OneToOne
  54. @JoinTable(
  55. name=&quot;auditor_stamp_duty_report_deed_of_assignment&quot;,
  56. joinColumns = @JoinColumn(name=&quot;auditor_stamp_duty_report_id&quot;, referencedColumnName = &quot;id&quot;),
  57. inverseJoinColumns = @JoinColumn(name=&quot;deed_of_assignment_id&quot;, referencedColumnName = &quot;id&quot;)
  58. )
  59. private DeedOfAssignment deed_of_assignment_id;

}

//second entity

package com.oasis.firsbacklogbackend.entity;

import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Data
@Entity
@Table(name = "deed_of_assignment")
public class DeedOfAssignment implements Serializable {

  1. @Id
  2. @GeneratedValue(strategy = GenerationType.IDENTITY)
  3. @Column(name=&quot;id&quot;)
  4. private Long id;
  5. @ManyToOne
  6. @JoinColumn(name=&quot;state_id&quot;, referencedColumnName=&quot;id&quot;)
  7. private State state;
  8. @ManyToOne
  9. @JoinColumn(name=&quot;lga_id&quot;, referencedColumnName = &quot;id&quot;)
  10. private Lga lga;
  11. @Column(name=&quot;ward&quot;)
  12. private Long ward;
  13. @Column(name=&quot;description_of_location&quot;)
  14. private String description_of_location;

}

  1. also look at my dto layer which I am using to transfer data for bith entities below:

import lombok.Data;
import java.time.LocalDate;

@Data
public class AuditorStampDutyReportDto {

  1. private Long id;
  2. private Long id_of_tax_payer_organization;
  3. private String duty_payer;
  4. private Long tin_of_tax_payer_organization;
  5. private String period_covered;
  6. private LocalDate date_of_transaction;
  7. private Long tin_of_duty_payer;
  8. private String address_of_duty_payer;
  9. private Long instrument_id;
  10. private Long assessment_number;
  11. private String receipt_number;
  12. private Double consideration;
  13. private Double rate;
  14. private Double amount_payable;
  15. private Double amount_paid;
  16. private Double balance;
  17. private Double penalty;
  18. private LocalDate date_of_payment;
  19. private Double amount_recoverable;
  20. private Double outstanding;
  21. private String remarks;
  22. private Long user_profile_id;
  23. private Long deed_of_assignment_id;
  24. private Long state_id;
  25. private Long lga_id;
  26. private Long ward;
  27. private String description_of_location;

}

  1. here is the service

@Data
@Service
public class AuditorStampDutyReportService {

  1. private Logger logger = Logger.getLogger(AuditorStampDutyReportService.class.getName());
  2. @Autowired
  3. private BanksRepository banksRepository;
  4. @Autowired
  5. private AuditorStampDutyReportRepository auditorStampDutyReportRepository;
  6. @Autowired
  7. private OrganizationRepository organizationRepository;
  8. @Autowired
  9. private LgaRepository lgaRepository;
  10. @Autowired
  11. private StateRepository stateRepository;
  12. @Autowired
  13. private InstrumentsRepository instrumentsRepository;
  14. @Autowired
  15. private DeedOfAssignmentRepository deedOfAssignmentRepository;
  16. @Autowired
  17. private UserProfileRepository userProfileRepository;
  18. public AuditorStampDutyReport dtoToEntity (AuditorStampDutyReportDto dto){
  19. AuditorStampDutyReport report = new AuditorStampDutyReport();
  20. report.setId(dto.getId());
  21. Organization organization = organizationRepository.findById(dto.getId_of_tax_payer_organization()).orElse(null);
  22. report.setOrganization(organization);
  23. report.setTin_of_tax_payer_organization(dto.getTin_of_tax_payer_organization());
  24. report.setDate_of_transaction(dto.getDate_of_transaction());
  25. report.setPeriod_covered(dto.getPeriod_covered());
  26. report.setDuty_payer(dto.getDuty_payer());
  27. report.setTin_of_duty_payer(dto.getTin_of_duty_payer());
  28. report.setAddress_of_duty_payer(dto.getAddress_of_duty_payer());
  29. Instruments instruments = instrumentsRepository.findById(dto.getInstrument_id()).orElse(null);
  30. report.setInstruments(instruments);
  31. report.setAssessment_number(dto.getAssessment_number());
  32. report.setReceipt_number(dto.getReceipt_number());
  33. report.setConsideration(dto.getConsideration());
  34. report.setRate(dto.getRate());
  35. report.setAmount_payable(dto.getAmount_payable());
  36. report.setAmount_paid(dto.getAmount_paid());
  37. report.setBalance(dto.getBalance());
  38. report.setPenalty(dto.getPenalty());
  39. report.setDate_of_payment(dto.getDate_of_payment());
  40. report.setAmount_recoverable(dto.getAmount_recoverable());
  41. report.setOutstanding(dto.getOutstanding());
  42. report.setRemarks(dto.getRemarks());
  43. UserProfile userProfile = userProfileRepository.findById(dto.getUser_profile_id()).orElse(null);
  44. report.setUserProfile(userProfile);
  45. //why is deed of assignment is not getting saved into database?

// DeedOfAssignment deedOfAssignment= null;
if(dto.getDeed_of_assignment_id()!=null && dto.getDeed_of_assignment_id() > 0) {
DeedOfAssignment deedOfAssignment = deedOfAssignmentRepository.findById(dto.getDeed_of_assignment_id()).orElse(null);
if (deedOfAssignment != null) {
report.setDeed_of_assignment_id(deedOfAssignment);
State state = stateRepository.findById(dto.getState_id()).orElse(null);
deedOfAssignment.setState(state);
Lga lga = lgaRepository.findById(dto.getLga_id()).orElse(null);
deedOfAssignment.setLga(lga);
deedOfAssignment.setWard(dto.getWard());
deedOfAssignment.setDescription_of_location(dto.getDescription_of_location());
}
}
report= auditorStampDutyReportRepository.save(report);
return report;
}

  1. data truncation

{
//gets into the auditor_stamp_duty-report table successfully
"id_of_tax_payer_organization": 1,
"id_of_duty_payer_or_bank": 29,
"tin_of_tax_payer_organization": 3329644,
"period_covered": "July 2017 to May 2010",
"date_of_transaction": "2020-11-29",
"tin_of_duty_payer_or_bank": 382890,
"address_of_duty_payer_or_bank": "15, IBB close, Aso Drive, Fct, Abuja",
"instrument_id": 13,
"assessment_number": 219,
"receipt_number": "cc92384",
"consideration": 19470.0,
"rate": 16.0,
"amount_payable": 22000,
"amount_paid": 280000,
"balance": 2999000.0,
"penalty": 398290.0,
"outstanding": 7800.0,
"remarks": "Are no longer in operation.",
"user_profile_id": 1,

//does not get into the deed_of_assignment table successfully

  1. &quot;deed_of_assignment_id&quot;: 6,
  2. &quot;state_id&quot;: 20,
  3. &quot;lga_id&quot;: 230,
  4. &quot;ward&quot;: 12,
  5. &quot;description_of_location&quot;: &quot;A brown bungalow&quot;
  6. }
  1. I would appreciate your help
  2. </details>
  3. # 答案1
  4. **得分**: 1
  5. 我通过按照项目要求修改了我的服务层逻辑,成功解决了问题。以下是我的服务部分的代码片段:
  6. ```java
  7. if (instruments != null && instruments.getName().equalsIgnoreCase("Deed of Assignment")) {
  8. DeedOfAssignment deedOfAssignment = new DeedOfAssignment();
  9. report.setDeedOfAssignmentId(deedOfAssignment);
  10. State state = stateRepository.findById(dto.getStateId()).orElse(null);
  11. deedOfAssignment.setState(state);
  12. if (state != null) {
  13. Lga lga = lgaRepository.findById(dto.getLgaId()).orElse(null);
  14. deedOfAssignment.setLga(lga);
  15. }
  16. deedOfAssignment.setWard(dto.getWard());
  17. deedOfAssignment.setDescriptionOfLocation(dto.getDescriptionOfLocation());
  18. }

我还在我的一对一实体映射中添加了(cascade=CascadeType.ALL),就像这样:

  1. @OneToOne(cascade = CascadeType.ALL)
  2. @JoinTable(
  3. name="auditor_stamp_duty_report_deed_of_assignment",
  4. joinColumns = @JoinColumn(name="auditor_stamp_duty_report_id", referencedColumnName = "id"),
  5. inverseJoinColumns = @JoinColumn(name="deed_of_assignment_id", referencedColumnName = "id")
  6. )
  7. private DeedOfAssignment deedOfAssignmentId;

这样做后,成功地将持久化数据保存到两个表/实体中,并且得到了所需的结果,而且不会截断数据。

英文:

I was able to fix it by modifying the logic of my service layer in line with the requirements of my project. Here is the code snippet for my service below:

  1. if (instruments != null &amp;&amp; instruments.getName().equalsIgnoreCase(&quot;Deed of Assignment&quot;)) {
  2. DeedOfAssignment deedOfAssignment = new DeedOfAssignment();
  3. report.setDeedOfAssignmentId(deedOfAssignment);
  4. State state = stateRepository.findById(dto.getStateId()).orElse(null);
  5. deedOfAssignment.setState(state);
  6. if (state != null) {
  7. Lga lga = lgaRepository.findById(dto.getLgaId()).orElse(null);
  8. deedOfAssignment.setLga(lga);
  9. }
  10. deedOfAssignment.setWard(dto.getWard());
  11. deedOfAssignment.setDescriptionOfLocation(dto.getDescriptionOfLocation());
  12. }

I also added (cascade=CascadeType.ALL) to my oneToOne entity mapping like this:

  1. @OneToOne(cascade = CascadeType.ALL)
  2. @JoinTable(
  3. name=&quot;auditor_stamp_duty_report_deed_of_assignment&quot;,
  4. joinColumns = @JoinColumn(name=&quot;auditor_stamp_duty_report_id&quot;, referencedColumnName = &quot;id&quot;),
  5. inverseJoinColumns = @JoinColumn(name=&quot;deed_of_assignment_id&quot;, referencedColumnName = &quot;id&quot;)
  6. )
  7. private DeedOfAssignment deedOfAssignmentId;

and it worked, saving the persisted data into the two tables/entities and producing the desired result without truncating the data.

huangapple
  • 本文由 发表于 2020年8月25日 07:21:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/63569932.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定