是否可以将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.
这有可能吗?如果是的话:怎么样?如果否:是否有替代方案?
答案 0 :(得分:2)
当Hibernate从表中读取10个客户时,它会创建10个Customer对象。它通过(...)
来做到这一点
更确切地说,Hibernate使用Class<T>#newInstance()
来创建实体的新实例,它依赖于无参数构造函数。因此需要提供它。
这有可能吗?如果是的话:怎么样?如果否:是否有替代方案?
您的要求看起来接近Hibernate论坛上的Possible to have Hibernate hydrate objects with Factory?主题,因此我引用Steve的回答(更新以匹配当前名称):
这是完全可行的。其实你 有两种选择:
- 创建自定义
EntityPersister
实施;- 创建自定义
醇>Interceptor
实现,特别是Interceptor.instantiate()
方法会 你感兴趣...
我认为我会采用拦截方式(不确定您的复杂情况,但实施工厂方法看起来非常简单)。
答案 1 :(得分:0)