Spring org.hibernate.PropertyAccessException:无法通过反射设置字段值[1]值
大家好,我是Spring的新手,我的项目中出现了以下错误: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
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
看