我为我们的表格填充了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
)。