【问题标题】:foreign key coming as null in springboot jpa one to many外键在spring boot jpa中为null一对多
【发布时间】:2021-05-23 18:05:33
【问题描述】:

当我保存实体时,子表中的外键是 为空

父类是由映射的子类slotdetails组成的Appointment 具有一对多的关系

package com.inskade.inkflow.appoinments;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@Entity()
@Table(name = "appoinment_detail")

public class Appointment  {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @CreationTimestamp
    @Column(name = "created_at", insertable = true, updatable = false)
    private Date createdAt;
    @UpdateTimestamp
    private Date updatedAt;


    
    private String userId;
    private LocalDate appointmentDate;

    
      @OneToMany(
                mappedBy = "appoinment",
                cascade = CascadeType.ALL,
                orphanRemoval = true
            )
            private List<SlotDetails> slotDetails = new ArrayList<>();
      
        public void addSlots(SlotDetails slot) {
            slotDetails.add(slot);
            slot.setAppoinment(this);
        }
     
        public void removeSlot(SlotDetails slot) {
            slotDetails.remove(slot);
            slot.setAppoinment(null);
        }
     
    }
    

子类是 Slotdetails,与父 Appoinment 有多对一的关系

import java.sql.Time;
import java.util.UUID;

import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Data
@Entity
public class SlotDetails {
    
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long slotId;
     @ManyToOne(fetch = FetchType.LAZY)
     
        private Appoinment appoinment;
     private Time appointmentStartTime;
        private Time appointmentEndTime;
    private String bookingStatus
    private String bookedClientId;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof SlotDetails )) return false;
        return slotId != null && slotId.equals(((SlotDetails) o).getSlotId());
    }
 
    @Override
    public int hashCode() {
        return getClass().hashCode();
    }

}

存储库

import java.time.LocalDate;
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface AppoinmentsRepository extends JpaRepository<Appoinment, Long> {


    List<Appoinment> findAllByAppointmentDateBetween(LocalDate startDate, LocalDate endDate);

}

孩子的表格信息显示

FOREIGN KEY (`appoinment_id`) REFERENCES `appoinment_detail` (`id`)

当我在子表中的 appoinment_id 为空时 调用appoinmentRepository.save,在父表中一切正常

请帮忙

【问题讨论】:

    标签: java spring-boot jpa persistence hibernate-mapping


    【解决方案1】:

    您尚未在SlotDetails 中为appointment 指定@JoinColumn

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="appoinment_id", nullable = false)
    private Appoinment appoinment;
    

    【讨论】:

    • 试过但没有用,我关注了这个博客vladmihalcea.com/… 在这个我尝试做双向@OneToMany 给定的
    • 这似乎很奇怪。您可以将代码粘贴到您构建实体并调用保存的位置吗?
    • 这里是课程 - github.com/spb722/testing
    猜你喜欢
    • 2022-09-23
    • 2019-02-07
    • 2019-04-16
    • 2022-01-16
    • 2013-03-22
    • 1970-01-01
    • 2019-07-04
    • 2020-01-24
    • 1970-01-01
    相关资源
    最近更新 更多