我有这样的域类:
非常简化:
class Person extends Domain {
Set<Contracts> contracts;
//...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "person", cascade = CascadeType.ALL)
public Set<Contracts> getContracts() {
return contracts;
}
//...
}
class Contract extends Domain {
Person person;
//...
@JoinColumn(name = "PERSON__ID", nullable = false)
public Person getPerson() {
return this.person;
}
//...
}
我有一个人的实例,想要创建一个新的合同。 全都反思。
我的第一次尝试是这样的:
Domain domain = ...;
Method getter = resolveGetter(domain); // Person.getContracts()
ParameterizedType returnType = (ParameterizedType) getter.getGenericReturnType();
Class<Domain> cls = (Class<Domain>)returnType.getActualTypeArguments()[0];
Domain instance = cls.newInstance();
OneToMany annotation = getter.getAnnotation(OneToMany.class);
String mappedBy = annotation.mappedBy();
现在我需要来自cls的setter方法,其中mappedBy描述来设置合同中的人。 但是我如何正确地得到了二传手?
一个可能的解决方案是通过类的方法名称,但我认为它很难看。我没有找到hibernate框架的方法来做到这一点。
有人有想法吗?
用法:
- 更新:
我通过
获得了hibernate属性JavaReflectionManager manager = new JavaReflectionManager();
XClass xClass = manager.toXClass(cls);
List<XProperty> declaredProperties = xClass.getDeclaredProperties(XClass.ACCESS_PROPERTY); // Our domains use only Property Access
for (XProperty xProperty : declaredProperties) {
if(xProperty.getName().equals(mappedBy)) {
// How to set the value in the property?
}
}
现在问题是如何在属性中设置值?