如何处理实体中的计算字段

时间:2012-12-15 21:25:38

标签: java spring hibernate

我对在我的实体中处理计算字段(即计数)的最佳方法有疑问。我有一个包含评论的企业实体,我不想在必要之前加载评论,但我确实希望在加载实体对象时获得评论的数量(计数)。处理这个问题的最佳方法是什么?我已经尝试创建一个numReviews字段并注释它@Transient,但是当我调用getReviews()。size()时会遇到一些关闭会话的问题。我想知道这是否是正确的方法,或者是否有更好的模式可以遵循?

@Entity
@Table(name="ESTABLISHMENT")
public class Establishment {
...
private Set<Review> reviews = new HashSet<Review>();
...
//Make this extra lazy so we can do a count without loading all the things
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "establishment")
    @LazyCollection(LazyCollectionOption.EXTRA)
    public Set<Review> getReviews() {
        return reviews;
    }
    public void setReviews(Set<Review> reviews) {
        this.reviews = reviews;
    }

    @Transient
    public int getNumReviews(){
        if(this.numReviews == null){
            numReviews = this.getReviews().size();
        }
        return numReviews;
    }

1 个答案:

答案 0 :(得分:0)

Correct可能是可见的。我的第一个想法是将所有的hibernate操作移动到DAO层,并确保在检索对象时,数据已加载,但可能很重

或者,我会使用FetchType.EAGER

如果仍然不适合你,请使用HQL(抱歉是有一些错误,我更习惯JPQL)

SELECT est, COUNT(rev) FROM Establishment est inner join est.reviews rev ....

当检索值时,每个对象检索其总数。