Java 无法通过反射设置器设置字段值

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 以下是触发错误的代码行:

在使用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
以下是触发错误的代码行:

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