OneToOne Lazy всегда выбирает ребенка - PullRequest
2 голосов
/ 14 июля 2011

У меня есть следующее @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. 
}

Теперь я пытаюсь получить объект User, используя HQL, в объекте, в котором есть диспетчер транзакций Spring, использующий AOP:

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 Ответ

5 голосов
/ 14 июля 2011

Поскольку один-к-одному обычно представляют очень связные объекты и по умолчанию выбираются с использованием объединения, поэтому у нет причин для выборки как пользователя, так и корзины нет особой причины. Я не уверен, почему вы видите два отдельных выбора. Я полагаю, что это должно произойти только в том случае, если вы скажете, что нужно выбирать, используя выбор вместо объединения. Эта статья хорошо анализирует личные отношения. Это может помочь вам.

...