Java Hibernate使用外键创建域实例

Java Hibernate使用外键创建域实例,java,hibernate,jpa,reflection,Java,Hibernate,Jpa,Reflection,我有这样的域类: 极其简化: class Person extends Domain { Set<Contracts> contracts; //... @OneToMany(fetch = FetchType.LAZY, mappedBy = "person", cascade = CascadeType.ALL) public Set<Contracts> getContracts() { return contracts; } //

我有这样的域类:

极其简化:

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;
  }
  //...
}
类人扩展域{
订立合同;
//...
@OneToMany(fetch=FetchType.LAZY,mappedBy=“person”,cascade=CascadeType.ALL)
公共集getContracts(){
归还合同;
}
//...
}
类契约扩展了域{
个人;
//...
@JoinColumn(name=“PERSON\uu ID”,nullable=false)
公众人物{
把这个人还给我;
}
//...
}
我得到了一个人的实例,想创建一个新合同。 全身反射

我的第一次尝试是这样的:

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();
Domain=。。。;
方法getter=resolvegatter(域);//Person.getContracts()
ParameterizedType returnType=(ParameterizedType)getter.getGenericReturnType();
类cls=(类)returnType.getActualTypeArguments()[0];
域实例=cls.newInstance();
OneToMany annotation=getter.getAnnotation(OneToMany.class);
字符串mappedBy=annotation.mappedBy();
现在我需要cls中的setter方法,其中包含mappedBy描述符,用于设置合同中的人员。 但是我怎样才能正确地得到二传手呢

一个可能的解决方案是通过类的方法名,但我认为这很难看。我没有找到hibernate框架的方法来实现这一点

有人有主意吗

用法:

  • Java 6 hibernate-core-3.6.10
  • hibernate-commons-annotations-3.2.0
  • hibernate-jpa-2.0-api-1.0.1
--更新:

我通过网络获得了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?
  }
}
JavaReflectionManager=newJavaReflectionManager();
XClass XClass=manager.toXClass(cls);
List declaredProperties=xClass.getDeclaredProperties(xClass.ACCESS_PROPERTY);//我们的域仅使用属性访问
对于(XProperty XProperty:declaredProperties){
if(xProperty.getName().equals(mappedBy)){
//如何在属性中设置值?
}
}

现在的问题是如何在属性中设置值?

为什么要使用反射?如果使用反射,那么当然必须按名称获取方法才能调用它们。这基本上就是反射的原理。我不认为用反射做这件事那么容易。Hibernate通常返回代理对象,特别是对于集合,以便它可以实现延迟加载和其他类似的优化。在这种情况下,反射变得非常困难。但是hibernate也必须为mappedBy注释获取setter。我不认为他们直接用了getter这个名字。为什么要反思?如果我不使用反射,我必须为大约60个域对象编写管理掩码。