【问题标题】:how to load multi set lazy in one hql by bibernate如何通过 bibernate 在一个 hql 中加载多组惰性
【发布时间】:2020-04-24 11:45:59
【问题描述】:

我正在开发 web spring + hibernate 项目 我的加载集有问题

我有一个 java 类实体

@Entity
public class Product 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> gifts;

@ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> suggestion;

@ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    Private Set<Product> relative;
}

礼物、建议和相关设置是 fetch = 懒惰的,我不想急于

现在我想在一个语句休眠查询中加载礼物、建议和相关产品

对我的想法最好的建议是什么

我无法更改源代码我想在加载产品时找到加载集合对象的方法

【问题讨论】:

  • 您现在想立即加载所有关联吗?意味着您想要一个数据库查询来获取产品以及所有相关的礼物、建议和亲戚?
  • 谢谢,但我保存到单独的表格中,命名为礼物、建议、亲戚。
  • 我需要一些时间来加载礼物、建议、亲戚,而不是永远

标签: java hibernate


【解决方案1】:

您可以创建实体图并在需要急切获取关联时获取该图。

1.首先在Product实体上声明实体图。

@Entity
@NamedEntityGraph(name = "products",
attributeNodes = {@NamedAttributeNode("gifts"),
  @NamedAttributeNode("suggestion"),
  @NamedAttributeNode("relative")})
public class Product
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    private String name;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private java.util.Set<Product> gifts;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> suggestion;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> relative;
}

2.然后将图表附加到存储库方法之一。

public interface ProductRepository extends JpaRepository<Product, Integer> {
        @EntityGraph(value = "products")
        Optional<Product> findById(Integer id);
    }

注意:您在 EntityGraph 属性节点中声明的所有关联都将立即加载,而 Product 中非属性节点的关联仍将延迟获取。

读取LOAD和FETCH类型的区别:LOAD Vs FETCH

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 2021-10-23
    • 2016-01-05
    • 2020-10-11
    • 1970-01-01
    • 2021-03-13
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多