如何解决如何避免保存来自JPA实体的截断数据
我试图保存来自两个不同实体的数据,这些实体分别名为auditor_stamp_duty_report和deed_of分配。这两个实体共享一对一的连接表关系。当我尝试使用post方法持久化来自邮递员的数据时,只有来自一个实体的数据才会保存到数据库中。其他实体的数据将被截断。
这是我的实体类;
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 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "id_of_tax_payer_organization",referencedColumnName = "id")
private Organization organization;
@Column(name = "tin_of_tax_payer_organization")
private Long tin_of_tax_payer_organization;
@Column(name = "period_covered")
private String period_covered;
@Column(name = "date_of_transaction")
private LocalDate date_of_transaction;
@JoinColumn(name = "duty_payer")
private String duty_payer;
@Column(name = "tin_of_duty_payer")
private Long tin_of_duty_payer;
@Column(name = "address_of_duty_payer")
private String address_of_duty_payer;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "instrument_id",referencedColumnName = "id")
private Instruments instruments;
@Column(name = "assessment_number")
private Long assessment_number;
@Column(name = "receipt_number")
private String receipt_number;
@Column(name = "consideration")
private Double consideration;
@Column(name = "rate")
private Double rate;
@Column(name = "amount_payable")
private Double amount_payable;
@Column(name = "amount_paid")
private Double amount_paid;
@Column(name = "balance")
private Double balance;
@Column(name = "penalty")
private Double penalty;
@Column(name = "outstanding")
private Double outstanding;
@Column(name = "remarks")
private String remarks;
@Column(name="amount_recoverable")
private Double amount_recoverable;
@Column(name="date_of_payment")
private LocalDate date_of_payment;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_profile_id",referencedColumnName = "id")
private UserProfile userProfile;
@OneToOne
@JoinTable(
name="auditor_stamp_duty_report_deed_of_assignment",joinColumns = @JoinColumn(name="auditor_stamp_duty_report_id",referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(name="deed_of_assignment_id",referencedColumnName = "id")
)
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 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@ManyToOne
@JoinColumn(name="state_id",referencedColumnName="id")
private State state;
@ManyToOne
@JoinColumn(name="lga_id",referencedColumnName = "id")
private Lga lga;
@Column(name="ward")
private Long ward;
@Column(name="description_of_location")
private String description_of_location;
}
还要查看我的dto层,该层用于为以下bith实体传输数据:
import lombok.Data;
import java.time.LocalDate;
@Data
public class AuditorStampDutyReportDto {
private Long id;
private Long id_of_tax_payer_organization;
private String duty_payer;
private Long tin_of_tax_payer_organization;
private String period_covered;
private LocalDate date_of_transaction;
private Long tin_of_duty_payer;
private String address_of_duty_payer;
private Long instrument_id;
private Long assessment_number;
private String receipt_number;
private Double consideration;
private Double rate;
private Double amount_payable;
private Double amount_paid;
private Double balance;
private Double penalty;
private LocalDate date_of_payment;
private Double amount_recoverable;
private Double outstanding;
private String remarks;
private Long user_profile_id;
private Long deed_of_assignment_id;
private Long state_id;
private Long lga_id;
private Long ward;
private String description_of_location;
}
这是服务
@Data
@Service
public class AuditorStampDutyReportService {
private Logger logger = Logger.getLogger(AuditorStampDutyReportService.class.getName());
@Autowired
private BanksRepository banksRepository;
@Autowired
private AuditorStampDutyReportRepository auditorStampDutyReportRepository;
@Autowired
private OrganizationRepository organizationRepository;
@Autowired
private LgaRepository lgaRepository;
@Autowired
private StateRepository stateRepository;
@Autowired
private InstrumentsRepository instrumentsRepository;
@Autowired
private DeedOfAssignmentRepository deedOfAssignmentRepository;
@Autowired
private UserProfileRepository userProfileRepository;
public AuditorStampDutyReport dtoToEntity (AuditorStampDutyReportDto dto){
AuditorStampDutyReport report = new AuditorStampDutyReport();
report.setId(dto.getId());
Organization organization = organizationRepository.findById(dto.getId_of_tax_payer_organization()).orElse(null);
report.setOrganization(organization);
report.setTin_of_tax_payer_organization(dto.getTin_of_tax_payer_organization());
report.setDate_of_transaction(dto.getDate_of_transaction());
report.setPeriod_covered(dto.getPeriod_covered());
report.setDuty_payer(dto.getDuty_payer());
report.setTin_of_duty_payer(dto.getTin_of_duty_payer());
report.setAddress_of_duty_payer(dto.getAddress_of_duty_payer());
Instruments instruments = instrumentsRepository.findById(dto.getInstrument_id()).orElse(null);
report.setInstruments(instruments);
report.setAssessment_number(dto.getAssessment_number());
report.setReceipt_number(dto.getReceipt_number());
report.setConsideration(dto.getConsideration());
report.setRate(dto.getRate());
report.setAmount_payable(dto.getAmount_payable());
report.setAmount_paid(dto.getAmount_paid());
report.setBalance(dto.getBalance());
report.setPenalty(dto.getPenalty());
report.setDate_of_payment(dto.getDate_of_payment());
report.setAmount_recoverable(dto.getAmount_recoverable());
report.setOutstanding(dto.getOutstanding());
report.setRemarks(dto.getRemarks());
UserProfile userProfile = userProfileRepository.findById(dto.getUser_profile_id()).orElse(null);
report.setUserProfile(userProfile);
//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;
}
数据截断
{
//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
"deed_of_assignment_id": 6,"state_id": 20,"lga_id": 230,"ward": 12,"description_of_location": "A brown bungalow"
}
感谢您的帮助
解决方法
我能够通过根据项目需求修改服务层的逻辑来对其进行修复。以下是我的服务的代码段:
if (instruments != null && instruments.getName().equalsIgnoreCase("Deed of Assignment")) {
DeedOfAssignment deedOfAssignment = new DeedOfAssignment();
report.setDeedOfAssignmentId(deedOfAssignment);
State state = stateRepository.findById(dto.getStateId()).orElse(null);
deedOfAssignment.setState(state);
if (state != null) {
Lga lga = lgaRepository.findById(dto.getLgaId()).orElse(null);
deedOfAssignment.setLga(lga);
}
deedOfAssignment.setWard(dto.getWard());
deedOfAssignment.setDescriptionOfLocation(dto.getDescriptionOfLocation());
}
我还将(cascade = CascadeType.ALL)添加到我的oneToOne实体映射中,如下所示:
@OneToOne(cascade = CascadeType.ALL)
@JoinTable(
name="auditor_stamp_duty_report_deed_of_assignment",joinColumns = @JoinColumn(name="auditor_stamp_duty_report_id",referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(name="deed_of_assignment_id",referencedColumnName = "id")
)
private DeedOfAssignment deedOfAssignmentId;
它起作用了,将持久数据保存到两个表/实体中,并在不截断数据的情况下产生了所需的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。