java - OneToOne Lazy 总是获取子项

标签 java hibernate spring jakarta-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. 
}

现在我尝试使用 HQL 在具有使用 AOP 的 Spring 事务管理器的对象中获取 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.....

为什么?

最佳答案

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

关于java - OneToOne Lazy 总是获取子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6696155/

相关文章:

java - 如何将监听 hibernate 事件的模块与实体本身分离?

java - hibernate : Getting error "nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -15"

java - 无法使用 Spring Boot 应用程序连接到 Docker 镜像

java - Maven 忽略自定义本地存储库

java - 反射和 ByteBuddy

java - jScience 中的单元;角速度的单位是什么?

java - 如何使用 clojure 实例化 Path 对象

Hibernate 实体类中的注释放置

java - spring-Unnamed bean 定义既不指定 'class' 也不指定 'parent' 也不指定 'factory-bean' - 无法生成 bean 名称

java - 使用 Thymeleaf 时,Spring security sessionscope 似乎为空