【发布时间】:2020-12-13 14:51:01
【问题描述】:
我正在尝试从名为 audit_stamp_duty_report 和 deed_of assignment 的两个不同实体中保存一堆数据。这 2 个实体共享一对一和连接表关系。当我尝试使用 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 层:
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"
}
感谢您的帮助
【问题讨论】:
-
由于使用 Join Table 的 2 个实体之间存在一对一关系,因此您应该在 DeedOfAssignment 实体中使用这些注释:
@OneToOne(cascade = CascadeType.ALL) @JoinTable(name="DeedOfAssignment_AuditorStampDutyReport", joinColumns = @JoinColumn(name="DeedOfAssignment_Id"), inverseJoinColumns = @JoinColumn(name="AuditorStampDutyReport_Id")) private AuditorStampDutyReport account; -
@SkillsIndexOutOfBounds 尝试此操作后,代码不起作用,出现错误“org.springframework.dao.InvalidDataAccessApiUsageException: java.lang.IllegalArgumentException: The given id must not be null!” 我有将代码重构回工作时,但仍然出现错误...
-
您在 AuditorStampDutyReport 实体上使用 @oneToOne 映射,因此您不必在 DeedOfAssignment 实体上使用相同的注释。您在 AuditorStampDutyReport
@OneToOne(cascade = CascadeType.ALL)上缺少级联尝试添加它应该可以工作。在设置deedOfAssignment的所有字段后也放这个report.setDeed_of_assignment_id(deedOfAssignment);
标签: java json hibernate spring-data-jpa