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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25295695/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 07:48:10  来源:igfitidea点击:

could not set a field value by reflection setter

javamysqlspringhibernate

提问by CodeMed

In a spring mvc application using hibernate and MySQL, I am getting an error which seems to indicate that a Nameentity cannot find the setter for the idproperty of the BaseEntitysuperclass of the Patiententity.

在使用 hibernate 和 MySQL 的 spring mvc 应用程序中,我收到一个错误,这似乎表明Name实体无法找到实体超类id属性的设置器。BaseEntityPatient

How can I resolve this error?

我该如何解决这个错误?

Here is the error message:

这是错误消息:

Caused by: org.hibernate.PropertyAccessException: could not set a field value by  
reflection setter of myapp.mypackage.Name.patient

Here is the line of code that triggers the error:

这是触发错误的代码行:

ArrayList<Name> names = (ArrayList<Name>) this.clinicService.findNamesByPatientID(patntId);

Here is the BaseEntity, which is the superclass of both Patientand Name:

这里是BaseEntity,这是两者的父类PatientName

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorFormula("(CASE WHEN dtype IS NULL THEN 'BaseEntity' ELSE dtype END)")
public class BaseEntity {

    @Transient
    private String dtype = this.getClass().getSimpleName();

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    protected Integer id;

    public void setId(Integer id) {this.id = id;}
    public Integer getId() {return id;}

    public void setDtype(String dt){dtype=dt;}
    public String getDtype(){return dtype;}

    public boolean isNew() {return (this.id == null);}

}

Here is the Patiententity:

这是Patient实体:

@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
}

Here is the Nameentity:

这是Name实体:

@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

}

The complete stack trace can be viewed at this link.

可以在此链接查看完整的堆栈跟踪。

The SQL generated by Hibernate for the above query is:

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

When I run this query through the MySQL command line client, it returns the only record in the test database table.

当我通过 MySQL 命令行客户端运行此查询时,它返回测试数据库表中的唯一记录。

采纳答案by JB Nizet

That's not what the stack trace says. The stack trace doesn't say that the ID can't be set. It says:

这不是堆栈跟踪所说的。堆栈跟踪并没有说无法设置 ID。它说:

Caused by: java.lang.IllegalArgumentException: Can not set org.springframework.samples.knowledgemanager.model.HL7Patient field org.springframework.samples.knowledgemanager.model.HL7USName.patient to org.springframework.samples.knowledgemanager.model.HL7USName

引起:java.lang.IllegalArgumentException:无法将 org.springframework.samples.knowledgemanager.model.HL7Patient 字段 org.springframework.samples.knowledgemanager.model.HL7USName.patient 设置为 org.springframework.samples.knowledgemanager.model.HL7USName

So, your HL7USName class has a field named patientof type HL7Patient, and it's impossible to set this field with a value of type HL7USName.

因此,您的 HL7USName 类有一个名为patienttype的字段HL7Patient,并且不可能将此字段设置为类型为 HL7USName 的值。

This means that your database contains a Name that has a foreign key to a row of type Name instead of a row of type Patient.

这意味着您的数据库包含一个 Name,该 Name 具有指向 Name 类型的行而不是 Patient 类型的行的外键。