OneToOne懒惰总是取小孩

时间:2011-07-14 15:53:57

标签: java hibernate spring java-ee lazy-loading

我有以下@OneToOne关系:

@Entity
@Table(name="USER")
public class User implements Serializable{

private Basket basket;

    @OneToOne(cascade = CascadeType.ALL,orphanRemoval=true,mappedBy="user", fetch=FetchType.LAZY )
    public Basket getBasket() {
        return basket;
    }

    public void setBasket(Basket basket) {
        this.basket = basket;
    }

//all other proerties are ommited and none relevant. 
}

现在是篮球课:

@Entity
@Table(name="BASKET")
public class Basket implements Serializable {

private User user;

@OneToOne(fetch=FetchType.LAZY)
    public User getUser() {
        return user;
    }
//all other proerties are ommited and none relevant. 
}

现在我正在尝试使用具有使用AOP的Spring事务管理器的对象中的HQL来获取User对象:

public User getUser(String param1,String param2) {
    Session session = this.sessionfactory.getCurrentSession();
    String queryString = "from objects.User user where user.param1=:param1 and user.param2=:param2";
    Query query = session.createQuery(queryString); 
    query.setString("param1", param1);
    query.setString("param2", param2);
    User user = (User) query.uniqueResult();
    return user;
}

但是我看到篮子也被取出了,虽然它是懒惰的:

Hibernate: select user0......
Hibernate: select basket0.....

为什么?

1 个答案:

答案 0 :(得分:5)

因为一对一通常代表高度内聚的对象,并且默认情况下使用连接提取,所以提取用户和购物篮的原因很少。我不确定你为什么会看到两个单独的选择。我相信只有当你特意告诉它使用select而不是join来获取时才会发生这种情况。 This article很好地分析了一对一的关系。它可能会帮助你。