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
could not set a field value by reflection setter
提问by CodeMed
In a spring mvc application using hibernate and MySQL, I am getting an error which seems to indicate that a Name
entity cannot find the setter for the id
property of the BaseEntity
superclass of the Patient
entity.
在使用 hibernate 和 MySQL 的 spring mvc 应用程序中,我收到一个错误,这似乎表明Name
实体无法找到实体超类id
属性的设置器。BaseEntity
Patient
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 Patient
and Name
:
这里是BaseEntity
,这是两者的父类Patient
和Name
:
@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 Patient
entity:
这是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 Name
entity:
这是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 patient
of type HL7Patient
, and it's impossible to set this field with a value of type HL7USName.
因此,您的 HL7USName 类有一个名为patient
type的字段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 类型的行的外键。