2012-03-19 160 views
0

我有两个POJO类Quote和RQuote,其中RQuote被定义为引用的子元素。在两个对应的hbm.xml文件中,两个类之间没有定义关系。防止在休眠状态下查询子对象

问题是,我有一个hql作为“从报价q选择总和(q.packagePrice)”。这个hql将查询Quote和RQuote对象,因此它返回两个和值。

我想sum函数只能在Quote对象上运行,而不能在其子RQuote上运行。无论如何要在Hibernate中做到这一点?谢谢你的帮助。

报价

public class Quote extends Base implements Auditable { 
    protected Client user; 
    protected Package subscriptionPackage; 

    // Default noarg constructor 
    public Quote() {} 

    // Accessors 

    public Client getUser() { 
     return user; 
    } 

    public void setUser(Client user) { 
     this.user = user; 
    } 

    public Package getSubscriptionPackage() { 
     return subscriptionPackage; 
    } 

    public void setSubscriptionPackage(Package subscriptionPackage) { 
     this.subscriptionPackage = subscriptionPackage; 
    } 


    public String getType() { 
     return "Quote"; 
    } 

} 

public class RQuote extends Quote { 

    // Default noarg constructor 
    public RQuote() {} 

    public String getType() { 
     return "RQuote"; 
    } 

} 
+0

你能提供你的课程纲要吗? – Woody 2012-03-19 15:39:57

+0

我添加了引用示例和RQuote。在Quote或RQuote中没有声明关联/集合。有关这个问题的任何建议。谢谢 – Raistlin 2012-03-19 16:47:30

+0

对于为什么会这样做,我无法看到任何立即有用的东西 - 我假定这两个类都按照'9.1.6在不同的表中。 hibernate.org上使用隐式多态性的每个具体类的表? – Woody 2012-03-19 17:30:40

回答

0

这是你的错误:

RQuote extends Quote 

您定义RQuote为引用的子类。因此,RQuote 的每个实例都是引用的一个实例。

现在,当Hibernate正在评估select sum(q.packagePrice) from Quote q时,它首先在它的缓存中查找所有已经加载的Quote的实例,并且它还可以找到引用实例RQuote的实例并使用它们。因此,之前由同一会话中的任何其他查询加载的所有RQuote都将包含在您的总和中。

另外Query.list()或Query.uniqueResult将无法按预期方式工作。

所以你必须纠正你的Java类RQuote,并且不要让它延长Quote。

+0

谢谢你的所有评论。在这种情况下,RQuote是为其他目的而定义的,它必须是Quote的孩子。我正试图解决由于添加此类而导致的副作用。这就是为什么我必须保留子类,但防止为特定hql加载子对象。有什么建议么?谢谢 – Raistlin 2012-03-20 13:01:09

+0

如果一个实体类是另一个实体类的子类,则Session.createQuery无法正常工作。忘记修复副作用 - 哪些副作用取决于选择的顺序 - 所以你永远不会确定你的应用程序正在工作。 – Johanna 2012-03-20 15:04:19

+0

如果RQuote确实必须扩展,可能有两种解决方案Quote:1)使用StatelessSession而不是Session。 StatelessSession不会缓存元素,所以问题可能不会出现。请记住,无状态会话有许多缺点。 2)创建一个抽象类AbstractQuote,它包含Quote和RQuote常用的所有方法和元素,并且没有hibernate映射。然后创建'Quote扩展AbstractQuote'和'RQuote extends AbstractQuote'(但Quote和RQuote之间没有直接关系)。 - 这两个命题我还没有尝试,没有保证。 – Johanna 2012-03-20 15:11:38