Spring org.hibernate.PropertyAccessException:无法通过反射设置字段值[1]值

Spring org.hibernate.PropertyAccessException:无法通过反射设置字段值[1]值,spring,hibernate,jpa,many-to-many,embeddable,Spring,Hibernate,Jpa,Many To Many,Embeddable,大家好,我是Spring的新手,我的项目中出现了以下错误: org.hibernate.PropertyAccessException: Could not set field value [1] value by reflection : [class com.**.domain.identities.NurseAgencyIdentity.agencyId] setter of com.**.domain.identities.NurseAgencyIdentity.agencyId

大家好,我是Spring的新手,我的项目中出现了以下错误:

org.hibernate.PropertyAccessException: Could not set field value [1] value by 
reflection : [class  com.**.domain.identities.NurseAgencyIdentity.agencyId]
setter of com.**.domain.identities.NurseAgencyIdentity.agencyId
在这个过程中涉及到一些类别:护士机构命名(摘要)、护理护理身份
护士-机构
之间存在多对多关系,并有一个额外的列
护士记录
。命名类是一个抽象类,它包含
id
name
字段,在我的设计中,许多表都在使用
id
作为子表的标识符。为了实现
many-To-many
,我必须在最后一个类NurseAgencyIdentity中使用
@embeddeble
注释,它是我的NurseAgency联接表的id。代码如下:

NurseGencyIdentity

@Embeddable
@Data
    public class NurseAgencyIdentity implements Serializable {

    @Column(name="nurse_id")
    private Long nurseId;

    @Column(name="agency_id")
    private Long agencyId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NurseAgencyIdentity that = (NurseAgencyIdentity) o;
        return Objects.equals(nurseId, that.nurseId) &&
                Objects.equals(agencyId, that.agencyId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nurseId, agencyId);
    }
}
@Entity
@Data
public class NurseAgency {

    @EmbeddedId
    private NurseAgencyIdentity id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("nurseId")
    private Nurse nurse;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("agencyId")
    private Agency agency;

    private String nurseRecord;

}
@Entity
@Data
public class Agency extends Named {

    private String description;

    @OneToMany(mappedBy = "agency", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<NurseAgency> nurses = new ArrayList<>();

}
NurseAgency

@Embeddable
@Data
    public class NurseAgencyIdentity implements Serializable {

    @Column(name="nurse_id")
    private Long nurseId;

    @Column(name="agency_id")
    private Long agencyId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NurseAgencyIdentity that = (NurseAgencyIdentity) o;
        return Objects.equals(nurseId, that.nurseId) &&
                Objects.equals(agencyId, that.agencyId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nurseId, agencyId);
    }
}
@Entity
@Data
public class NurseAgency {

    @EmbeddedId
    private NurseAgencyIdentity id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("nurseId")
    private Nurse nurse;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("agencyId")
    private Agency agency;

    private String nurseRecord;

}
@Entity
@Data
public class Agency extends Named {

    private String description;

    @OneToMany(mappedBy = "agency", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<NurseAgency> nurses = new ArrayList<>();

}
护士

@Entity
@Data
public class Nurse {

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

    @Enumerated(EnumType.STRING)
    private License license;

    @OneToMany(mappedBy = "nurse", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<NurseAgency> agencies = new ArrayList<>();

    // need the extra column
    public void addAgency(Agency agency) {//, String nurseRecord) {
        NurseAgency nurseAgency = new NurseAgency();
        nurseAgency.setAgency(agency);
        nurseAgency.setNurse(this);
        //nurseAgency.setNurseRecord(nurseRecord);
        agency.getNurses().add(nurseAgency);
    }

    public void removeAgency(Agency agency) {
        for (Iterator<NurseAgency> iterator = agencies.iterator(); iterator.hasNext(); ) {
            NurseAgency nurseAgency = iterator.next();
            if (nurseAgency.getNurse().equals(this) && nurseAgency.getAgency().equals(agency)){
                iterator.remove();
                nurseAgency.getAgency().getNurses().remove(nurseAgency);
                nurseAgency.setNurse(null);
                nurseAgency.setAgency(null);
            }
        }
    }

    @Override
    public String toString() {
        return id + " " + firstName + " " + middleName + " " + lastName;
    }
}
代理机构

@Embeddable
@Data
    public class NurseAgencyIdentity implements Serializable {

    @Column(name="nurse_id")
    private Long nurseId;

    @Column(name="agency_id")
    private Long agencyId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NurseAgencyIdentity that = (NurseAgencyIdentity) o;
        return Objects.equals(nurseId, that.nurseId) &&
                Objects.equals(agencyId, that.agencyId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nurseId, agencyId);
    }
}
@Entity
@Data
public class NurseAgency {

    @EmbeddedId
    private NurseAgencyIdentity id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("nurseId")
    private Nurse nurse;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("agencyId")
    private Agency agency;

    private String nurseRecord;

}
@Entity
@Data
public class Agency extends Named {

    private String description;

    @OneToMany(mappedBy = "agency", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<NurseAgency> nurses = new ArrayList<>();

}
@实体
@资料
公共类代理扩展名为{
私有字符串描述;
@OneToMany(mappedBy=“agency”,cascade=CascadeType.ALL,orphan=true)
私有列表=新的ArrayList();
}
在尝试为联接表设定种子时,出现以下错误:

BootStrapData

@Component
public class BootStrapData implements CommandLineRunner {

    @Autowired
    private final NurseRepository nurseRepository;
    @Autowired
    private final AgencyRepository agencyRepository;
    private final NurseAgencyRepository nurseAgencyRepository;

    public BootStrapData(NurseRepository nurseRepository, AgencyRepository agencyRepository, NurseAgencyRepository nurseAgencyRepository) {
        this.nurseRepository = nurseRepository;
        this.agencyRepository = agencyRepository;
        this.nurseAgencyRepository = nurseAgencyRepository;
    }


    @Override
    public void run(String... args) throws Exception {

        System.out.println("Loading agencies ");
        ArrayList<Agency> agencies = GetAgencies();

        System.out.println("Loading Nurses ");
        ArrayList<Nurse> nurses = GetNurses(agencies);

        nurses.stream().forEach( n -> nurseRepository.save(n));
        agencies.stream().forEach( a -> agencyRepository.save(a));

        //Nurses Agencies
        ArrayList<NurseAgency> nurseAgencies = new ArrayList<>(1);
        nurseAgencies.addAll(SetNurseAndAgencies(nurses.get(0), new Agency[]{agencies.get(0), agencies.get(1), agencies.get(2)}));
        nurseAgencies.addAll(SetNurseAndAgencies(nurses.get(1), new Agency[]{agencies.get(0), agencies.get(1)}));
        nurseAgencies.addAll(SetNurseAndAgencies(nurses.get(2), new Agency[]{agencies.get(1), agencies.get(2)}));
        for (int i=0; i<nurseAgencies.size();i++){
            nurseAgencyRepository.save(nurseAgencies.get(i)); // I've got the error in first iteration in this line
    }
}


    private ArrayList<Agency> GetAgencies() {

        ArrayList<Agency> agencies = new ArrayList<>(3);

        Agency a1 = new Agency();
        a1.setName("Agency 1");
        agencies.add(a1);

        Agency a2 = new Agency();
        a2.setName("Agency 2");
        agencies.add(a2);

        Agency a3 = new Agency();
        a3.setName("Agency 3");
        agencies.add(a3);

        return agencies;
    }

    private ArrayList<Nurse> GetNurses(ArrayList<Agency> agencies) {

        ArrayList<Nurse> nurses = new ArrayList<>(3);

        Nurse n1 = new Nurse();
        n1.setFirstName("Mario");
        n1.setLastName("Perez");
        nurses.add(n1);

        Nurse n2 = new Nurse();
        n2.setFirstName("Luis");
        n2.setLastName("Ruiz");
        nurses.add(n2);

        Nurse n3 = new Nurse();
        n3.setFirstName("Maria");
        n3.setLastName("Crez");
        nurses.add(n3);

        return nurses;
    }


    private ArrayList<NurseAgency> SetNurseAndAgencies(Nurse nurse, Agency[] agencies) {

        ArrayList<NurseAgency> nurseagencies = new ArrayList<>(agencies.length);

        for (int i=0; i<agencies.length; i++){
            NurseAgency na = new NurseAgency();
            na.setNurse(nurse);
            na.setAgency(agencies[i]);
            na.setNurseRecord(nurse.getFirstName() + agencies[i].getName());
            nurseagencies.add(na);
        }
        return nurseagencies;
    }
}
@组件
公共类BootStrapData实现CommandLineRunner{
@自动连线
私人最终托儿所托儿所;
@自动连线
私人最终代理存储库代理存储库;
私人最终NurseAgencyRepository NurseAgencyRepository;
公共引导数据库(NurseRepository NurseRepository、AgencyRepository AgencyRepository、NurseAgencyRepository NurseAgencyRepository){
this.nurseRepository=nurseRepository;
this.agencyRepository=agencyRepository;
this.nurseAgencyRepository=nurseAgencyRepository;
}
@凌驾
公共无效运行(字符串…参数)引发异常{
System.out.println(“装载机构”);
ArrayList agencies=GetAgencies();
System.out.println(“加载护士”);
ArrayList护士=GetNurses(机构);
护士.stream().forEach(n->nurseRepository.save(n));
agents.stream().forEach(a->agencyRepository.save(a));
//护士机构
ArrayList nurseAgencies=新的ArrayList(1);
NurseAgences.addAll(setNurseAndagences(护士.get(0),新机构[]{agents.get(0),agents.get(1),agents.get(2)});
NurseAgences.addAll(设置NurseAndagences(护士.get(1),新机构[]{agents.get(0),agents.get(1));
NurseAgences.addAll(设置NurseAndagences(护士.get(2),新机构[]{agents.get(1),agents.get(2));

对于(int i=0;i请尝试将NursAgency上的NursAgencyIdentity声明更改为:

@EmbeddedId
private NurseAgencyIdentity id;
致:

我没有看到完整的堆栈跟踪,但根本原因可能是当hibernate试图通过对NurseAgencyIdentity的反射来设置字段(在您的情况下是生成的agencyId[1])时出现了NullPointerException,并且该字段为null