【问题标题】:Hibernate configure how to create an objectHibernate 配置如何创建对象
【发布时间】:2011-04-22 22:22:31
【问题描述】:

是否可以配置 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.

这可能吗?如果是:如何?如果没有:是否有替代方案?

【问题讨论】:

    标签: nhibernate hibernate orm


    【解决方案1】:

    【讨论】:

    • 结果听起来不错,但与实现拦截器相比仍然看起来相当复杂。 (但还必须深入阅读这两种资源。)
    【解决方案2】:

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

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

    这有可能吗?如果是:如何?如果没有:是否有替代方案?

    您的要求看起来接近 Hibernate 论坛上的 Possible to have Hibernate hydrate objects with Factory? 线程,所以我将引用史蒂夫的回答(已更新以匹配当前名称):

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

    1. 创建自定义EntityPersister 实现;
    2. 创建一个自定义的Interceptor 实现,特别是 Interceptor.instantiate() 方法将 让你感兴趣...

    我想我会采用拦截器方式(不确定您的复杂场景,但实现工厂方法看起来很容易)。

    【讨论】:

    • 嗨帕斯卡。我实现了我自己的Interceptor,它做到了。我继承了EmptyInterceptor 并覆盖了OnLoad 而不是instantiate,因为到目前为止我只需要在对象上设置一个属性,这样NHibernate 就可以从类字符串创建对象并设置它的ID来自 ISerializable 对象。有了这个,我实现了类似于我最后一行代码Customer c = new Customer(someObject) 的东西,而不是设置一个只读属性c.TheObject = someObject
    • @chiccodoro:好!感谢您的反馈。
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多