我为我们的表格填充了HBM文件。我认为创建了Hibernate将使用的Java实体。在实体中,我有一个空的构造函数,然后是一个具有所有字段的完整构造函数。我也按照与HBM文件相同的顺序放置它们。

每次Hibernate使用Entity时,它总是调用空的构造函数而不是完整的构造函数。

是否有使Hibernate使用完整构造函数的窍门或其他方法?实体的所有子代也正在发生这种情况。我遇到了一个问题,我的query.list()运行缓慢,想让它正常工作以查看它是否会加快速度。

谢谢!

注意:
我没有包括HBM和Java文件的内容,因为(a)它包含公司信息,并且(b)它很大。剥离出来将花费很长时间。很抱歉,这不便:(

最佳答案

有3种通过Hibernate实例化对象的策略(据我所知)。

标准方法

HQL或诸如select from cat之类的条件查询将创建POJO(此处为Cat的实例-或子类),而Hibernate将通过调用no-arg构造函数来创建POJO。从文档:


  所有持久性类都必须具有默认的构造函数(可以是非公共的),以便Hibernate可以使用java.lang.reflect.Constructor.newInstance()实例化它们。建议使用至少包可见性定义此构造函数,以使运行时代理生成正常工作。


使用HQL选择构造函数

可以引用特定的构造函数,以通过HQL查询中的特制选择语句来调用。
例如。 select new com.example.Cat(cat.id, cat.name) from Cat有效。如果正确定义了您的请求,则还可以在选择中使用诸如count()之类的功能。这将在Cat上调用2个参数构造函数-尽管我认为在多态的情况下,它不会自动调整以找到另一个Cat的类。

您可以在文档中探索各种可能性(例如,如何建立列表):http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select

使用结果转换器

ResultTransformer的概念允许您在Criteria对象上指定如何将结果转换为对象。使用以AliasToBeanConstructorResultTransformer作为参数的java.lang.Constructor,可以选择要调用的构造函数。
(默认情况下,每个条件都有一个ResultTransformer,即RootEntityResultTransformer)。

09-30 15:52
查看更多