有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Hibernate保存父类历史记录表中的最后一条记录

线程标题可能有点误导,但我的问题是:

我有以下三个表,使用Hibernate(带注释)进行映射:

@SuppressWarnings("serial")
@Entity
@Table(name = "payment", catalog = "db")
public class Payment implements java.io.Serializable {

    private Long paymentId;
    private Set<PaymentStateHistory> paymentStateHistory = new HashSet<>(0);

    @Id
    @Column(name = "payment_id", unique = true, nullable = false)
    public long getPaymentId() {
        return this.idSolicitud;
    }

    public void setPaymentId(Long paymentId) {
        this.paymentId = paymentId;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "payment")
    public Set<PaymentStateHistory> getPaymentStateHistory() {
        return this.paymentStateHistory;
    }

    public void setPaymentStateHistory(Set<PaymentStateHistory> paymentStateHistory) {
        this.paymentStateHistory = paymentStateHistory;
    }
}

@SuppressWarnings("serial")
@Entity
@Table(name = "payment_state_history", catalog = "db")
public class PaymentStateHistory implements java.io.Serializable {

    private Long stateHistoryId;
    private PaymentState paymentState;
    private Payment payment;
    private Date stateDate;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "state_history_id", unique = true, nullable = false)
    public Long getStateHistoryId() {
       return this.stateHistoryId;
    }

    public void setStateHistoryId(Long stateHistoryId) {
       this.stateHistoryId = stateHistoryId;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "state_id", nullable = false)
    public PaymentState getPaymentState() {
       return this.paymentState;
    }

    public void setPaymentState(PaymentState paymentState) {
       this.paymentState = paymentState;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "payment_id", nullable = false)
    public Payment getPayment() {
       return this.payment;
    }

    public void setPayment(Payment payment) {
       this.payment = payment;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "state_date", length = 19)
    public Date getStateDate() {
       return this.stateDate;
    }

    public void setStateDate(Date stateDate) {
       this.stateDate = stateDate;
    }
}

@SuppressWarnings("serial")
@Entity
@Table(name = "payment_state", catalog = "db")
public class PaymentState implements java.io.Serializable {

    private Integer paymentStateId;
    private String info;
    private Set<PaymentStateHistory> paymentStateHistory = new HashSet<>(0);

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "payment_state_id", unique = true, nullable = false)
    public Integer getPaymentStateId() {
        return this.paymentStateId;
    }

    public void setPaymentStateId(Integer paymentStateId) {
        this.paymentStateId = paymentStateId;
    }

    @Column(name = "info", nullable = false, length = 100)
    public String getInfo() {
        return this.info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "paymentState")
    public Set<PaymentStateHistory> getPaymentStateHistory() {
        return this.paymentStateHistory;
    }

    public void setPaymentStateHistory(Set<PaymentStateHistory> paymentStateHistory) {
        this.paymentStateHistory = paymentStateHistory;
    }
}

基本上,payment_state_history维护了付款状态更改的历史记录,每个状态都有更改的日期

这种方式的映射效果很好,Payment包含一组它的状态更改,但我想知道是否有一种方法可以映射这些关系,以便在Payment中保存最后一个(最新日期)PaymentState,这样我就可以通过加载所需的付款来访问它,并执行类似payment.getLastState()的操作

付款表还有一个“last_state_id”列,将该行与payment_state_history表中该付款的最后状态相关联(每次状态更改时更新)。我知道我可以映射该id,并使用该id查找相应的状态,但它会重新查询更多对数据库的查询,使系统速度变慢,因此在付款时保存PaymentState对象将是理想的

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    您可以在支付实体中添加一个新成员,如下所示

    private PaymentStateHistory lastPaymentStateHistory;
    

    添加getter和setter,如下所示

    public void setLastPaymentStateHistory(){
           //code to loop throught paymentStateHistory and set the lastPaymentStateHistory
    }
    @Transient
    public void getLastPaymentStateHistory(){ 
       return this.lastPaymentHistory;
    }
    

    然后更新paymentStateHistory的setter,如下所示

        public void setPaymentStateHistory(Set<PaymentStateHistory> paymentStateHistory) {
        this.paymentStateHistory = paymentStateHistory;
        setLastPaymentStateHistory();
    }