Hibernate配置如何创建对象

时间:2010-10-08 14:19:16

标签: nhibernate hibernate orm

是否可以将Hiberate / NHibernate配置为在从数据库读取时不使用默认构造函数来创建对象?

当Hibernate从表中读取10个客户时,它会创建10个Customer个对象。它是通过

完成的
Customer c = new Customer();

我可以告诉Hibernate执行以下操作:

Customer c = ACertainStaticFactory.CreateNewCustomer();

甚至管理工厂实例:

ACertainFactory factory = .....;
Customer c = factory.CreateNewCustomer();

甚至更复杂,传递我之前设置的参数:

// My client code
Query query = session.CreateQuery(...);
// either:
query.SetSomeParameter(someObject);
// or:
session.SetSomeParameter(someObject);

query.List();

// Hibernate should then behave like this:
Customer c = new Customer(someObject);
// or
Customer c = ACertainStaticFactory.CreateNewCustomer(someObject);
// etc.

这有可能吗?如果是的话:怎么样?如果否:是否有替代方案?

2 个答案:

答案 0 :(得分:2)

  

当Hibernate从表中读取10个客户时,它会创建10个Customer对象。它通过(...)

来做到这一点

更确切地说,Hibernate使用Class<T>#newInstance()来创建实体的新实例,它依赖于无参数构造函数。因此需要提供它。

  

这有可能吗?如果是的话:怎么样?如果否:是否有替代方案?

您的要求看起来接近Hibernate论坛上的Possible to have Hibernate hydrate objects with Factory?主题,因此我引用Steve的回答(更新以匹配当前名称):

  

这是完全可行的。其实你   有两种选择:

     
      
  1. 创建自定义EntityPersister实施;
  2.   
  3. 创建自定义Interceptor实现,特别是   Interceptor.instantiate()方法会   你感兴趣...
  4.   

我认为我会采用拦截方式(不确定您的复杂情况,但实施工厂方法看起来非常简单)。

答案 1 :(得分:0)