Java 如何避免保存来自JPA实体的截断数据

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

我试图保存来自两个不同实体的一组数据,这两个实体分别是审计员、印花税报告和转让契据。这两个实体共享一对一和联接表关系。当我尝试使用post方法持久化来自postman的数据时,只有来自一个实体的数据被保存到数据库中。另一个实体的数据被截断

这是我的实体类


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);