Java 无法通过反射设置器设置字段值
在使用hibernate和MySQL的spring mvc应用程序中,我得到一个错误,它似乎表明Java 无法通过反射设置器设置字段值,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,在使用hibernate和MySQL的spring mvc应用程序中,我得到一个错误,它似乎表明名称实体找不到患者实体的BaseEntity超类的id属性的setter 如何解决此错误? 以下是错误消息: Caused by: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of myapp.mypackage.Name.patient 以下是触发错误的代码行:
名称
实体找不到患者
实体的BaseEntity
超类的id
属性的setter
如何解决此错误?
以下是错误消息:
Caused by: org.hibernate.PropertyAccessException: could not set a field value by
reflection setter of myapp.mypackage.Name.patient
以下是触发错误的代码行:
ArrayList<Name> names = (ArrayList<Name>) this.clinicService.findNamesByPatientID(patntId);
以下是患者
实体:
@Entity
@Table(name = "patient")
public class Patient extends BaseEntity{
@OneToMany(mappedBy = "patient")
private Set<Name> names;
protected void setNamesInternal(Set<Name> nms) {this.names = nms;}
protected Set<Name> getNamesInternal() {
if (this.names == null) {this.names = new HashSet<Name>();}
return this.names;
}
public List<Name> getNames() {
List<Name> sortedNames = new ArrayList<Name>(getNamesInternal());
PropertyComparator.sort(sortedNames, new MutableSortDefinition("family", true, true));
return Collections.unmodifiableList(sortedNames);
}
public void addName(Name nm) {
getNamesInternal().add(nm);
nm.setPatient(this);
}
//other stuff
}
@Entity
@Table(name = "name")
public class Name extends BaseEntity{
@ManyToOne
@JoinColumn(name = "patient_id")
private Patient patient;
public Patient getPatient(){return patient;}
public void setPatient(Patient ptnt){patient=ptnt;}
//other stuff
}
可以查看完整的堆栈跟踪
Hibernate为上述查询生成的SQL为:
select distinct hl7usname0_.id as id1_0_0_, givennames1_.id as id1_45_1_,
hl7usname0_.family as family1_44_0_, hl7usname0_.patient_id as patient3_44_0_,
hl7usname0_.person_id as person4_44_0_, hl7usname0_.suffix as suffix2_44_0_,
hl7usname0_.usecode as usecode5_44_0_, hl7usname0_.codesystem as codesyst6_44_0_,
givennames1_.given as given2_45_1_, givennames1_.name_id as name3_45_1_,
givennames1_.name_id as name3_0_0__, givennames1_.id as id1_45_0__
from hl7_usname hl7usname0_
left outer join hl7_usname_given givennames1_ on hl7usname0_.id=givennames1_.name_id
where hl7usname0_.patient_id=1
当我通过MySQL命令行客户端运行此查询时,它将返回测试数据库表中的唯一记录。堆栈跟踪不是这样说的。堆栈跟踪没有说明无法设置ID。它说: 原因:java.lang.IllegalArgumentException:无法将org.springframework.samples.knowledgemanager.model.hl7患者字段org.springframework.samples.knowledgemanager.model.HL7USName.patient设置为org.springframework.samples.knowledgemanager.model.HL7USName 因此,您的HL7USName类有一个名为
patient
的字段,其类型为HL7Patient
,不可能将此字段设置为HL7USName类型的值
这意味着您的数据库包含一个名称,该名称的外键指向类型为Name的行,而不是类型为Patient的行。完整堆栈跟踪是什么样子的?对于这个特定的错误消息,通常在堆栈跟踪的下半部分有一个更精确、更细粒度的错误。@isim我有一个类似的问题。你愿意帮我吗?这是链接:不,我自己翻译的。你读过我的答案了吗?@JB你比我快;)您的实体表示一个名称包含一个患者。在表“name”中,有一列名为“patient_id”。因此,此列应包含患者的ID。但此列中至少有一行具有另一个名称的ID。Patient和name都是entity BaseEntity的实例。假设调用
session.get(BaseEntity.class,1)
。冬眠应该返回什么?病人还是名字?它们都有相同的ID。这是无效的。由于它们都是BaseEntity实例,因此姓名可能与患者的ID不同。为什么BaseEntity是@Entity
,而不是@MappedSuperclass
?那么您的实体可能没有相同的ID。ID应该是唯一标识实体的。
select distinct hl7usname0_.id as id1_0_0_, givennames1_.id as id1_45_1_,
hl7usname0_.family as family1_44_0_, hl7usname0_.patient_id as patient3_44_0_,
hl7usname0_.person_id as person4_44_0_, hl7usname0_.suffix as suffix2_44_0_,
hl7usname0_.usecode as usecode5_44_0_, hl7usname0_.codesystem as codesyst6_44_0_,
givennames1_.given as given2_45_1_, givennames1_.name_id as name3_45_1_,
givennames1_.name_id as name3_0_0__, givennames1_.id as id1_45_0__
from hl7_usname hl7usname0_
left outer join hl7_usname_given givennames1_ on hl7usname0_.id=givennames1_.name_id
where hl7usname0_.patient_id=1