Java 如何避免保存来自JPA实体的截断数据
我试图保存来自两个不同实体的一组数据,这两个实体分别是审计员、印花税报告和转让契据。这两个实体共享一对一和联接表关系。当我尝试使用post方法持久化来自postman的数据时,只有来自一个实体的数据被保存到数据库中。另一个实体的数据被截断 这是我的实体类Java 如何避免保存来自JPA实体的截断数据,java,json,hibernate,spring-data-jpa,Java,Json,Hibernate,Spring Data Jpa,我试图保存来自两个不同实体的一组数据,这两个实体分别是审计员、印花税报告和转让契据。这两个实体共享一对一和联接表关系。当我尝试使用post方法持久化来自postman的数据时,只有来自一个实体的数据被保存到数据库中。另一个实体的数据被截断 这是我的实体类 import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import javax.persistence.*; import java.io.Seria
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层,我正在使用该层传输比特实体的数据,如下所示:
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());
}
我还向OneTONE实体映射添加了(cascade=CascadeType.ALL),如下所示:
@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;
它起到了作用,将持久化数据保存到两个表/实体中,并在不截断数据的情况下生成所需的结果。由于使用联接表的两个实体之间存在一对一的关系,因此您应该在DeedOfAssignment实体中使用这些注释:
@OneToOne(cascade=CascadeType.ALL)@JoinTable(name)=“Deedofasignment\u AuditorStampDutyReport”,joinColumns=@JoinColumn(name=“Deedofasignment\u Id”),inverseJoinColumns=@JoinColumn(name=“AuditorStampDutyReport\u Id”))私有AuditorStampDutyReport帐户;
@SkillsIndexOutOfBounds尝试此操作后,代码不起作用,我收到错误”“org.springframework.dao.InvalidDataAccessApiUsageException:java.lang.IllegalArgumentException:给定的id不能为null!“我已将代码重构回其工作时的状态,但仍会出现错误……您正在AuditorStampDutyReport实体上使用@OneTONE映射,因此不必在DeedOfasignment实体上使用相同的注释。您缺少AuditorStampDutyReport@OneTONE上的级联(级联=级联类型.ALL)
尝试添加此项,它应该会起作用。在设置deedofasignment的所有字段后,也将此报告放置在setdeded\u of\u assignment\u id(deedofasignment);