当前位置: 首页 > 知识库问答 >
问题:

SpringJPARepository不懒还渴望

陶修洁
2023-03-14

我有对象主位置和主国家/地区

MasterLocation.java

@Entity
@Table(name = "master_location", schema = "public", catalog = "master_db")
@NamedEntityGraphs({
        @NamedEntityGraph(name = "MasterLocation.joinsWithMasterCountries",attributeNodes = {
                @NamedAttributeNode("masterCountriesByCountryCode")
        }),
        @NamedEntityGraph(name = "MasterLocation.noJoins",attributeNodes = {})
})
public class MasterLocation {
    private String locationCode;
    private String locationName;
    private String countryCode;
    private Integer agencyCode;
    private String port;
    private String place;
    private String userId;
    private Timestamp dateCreated;
    private Timestamp lastModified;
    private String portRefFrom;
    private String portRefTo;
    private String valid;
    private String regionCode;
    private String bookingRef;

    private MasterCountries masterCountriesByCountryCode;
    @ManyToOne(fetch = FetchType.LAZY)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(referencedColumnName = "iso_3166_1_alpha_2_code", name = "country_Code")
    public MasterCountries getMasterCountriesByCountryCode() {
        return masterCountriesByCountryCode;
    }
}

主位置存储库.java

@Repository
public interface MasterLocationRepository extends JpaRepository<MasterLocation, Integer> {

    @EntityGraph(value = "MasterLocation.noJoins",type = EntityGraph.EntityGraphType.LOAD)
    Page<MasterLocation> findByLocationNameLikeIgnoreCase(String locationName, Pageable pageable);
}

为什么对象MasterCountries仍然加载在findByLocationNameLikeIgnoreCase上?如何在此存储库中禁用获取主国家/地区?

谢谢

共有1个答案

滑弘扬
2023-03-14

我假设您使用Hibernate作为您的JPA提供者。默认情况下,所有单个属性都被急切地加载,甚至一对一或多对一关系也被注释为惰性。

为了能够延迟加载单个属性,您必须使用Hibernate的字节码增强支持。在这篇Vlad Mihalcea的帖子中,您将找到如何使用Maven激活它。您只需要将以下插件添加到pom.xml文件中:

<plugin>
    <groupId>org.hibernate.orm.tooling</groupId>
    <artifactId>hibernate-enhance-maven-plugin</artifactId>
    <version>${hibernate.version}</version>
    <executions>
        <execution>
            <configuration>
                <enableLazyInitialization>true</enableLazyInitialization>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

此外,请尝试将@EntityGraph注释类型参数更改为FETCH,而不是LOAD,或者使用FetchType.LAZY.注释master CountriesByCountryCode使用当前配置(EntityGraphType.LOAD),未包含在EntityGraph定义中的属性将保持其默认的FETCH/LOAD配置。查看此处了解更多详细信息

在另一篇文章中,Vlad再次谈到了字节码增强,并提供了另一个选项:子实体。我自己还没有尝试过子实体选项,所以我不能告诉你它有多好。

最后,另一种选择,需要更多的工作,但我认为是最好的选择,是使用投影DTO来仅选择每个案例所需的数据。

 类似资料:
  • 问题内容: 我有,与有着多对多的关系。 因此表布局为: 为了得到实体A的对象:我叫其不 使用spring和hibernate。 问题是,有时后续代码仅需要A,有时后续代码将继续访问关联的B,因此我们希望在某些情况下使用 延迟加载, 在某些情况下则 渴望 使用。但是问题是所有数据库访问都是通过同一单一数据库提供的,因此只有一种方法。 我应该创建方法getById()的两个版本吗? 但是对于更复杂的情

  • 我有一个问题,就是基于hasMany关系从数据库中获取数据并将其发送到Larave中的api。在下面的代码中,Laravel没有给我客户id=$id的产品。我不知道为什么,我不能在$query旁边发送$id。如果我把号码写在“我有很好的安全套,但我需要自动拿。 所有api代码 先谢谢你。

  • 问题内容: 如果按以下方式实现单例, 此实现与延迟初始化方法有何不同?在这种情况下,实例将在加载类时创建,并且仅在第一次使用时才加载类本身(例如,Singleton.getInstance(),而当您声明实例Singleton singleton = null;时则不会)。 即使采用惰性初始化方法,该实例也是在对getInstance()的调用上创建的 我在这里想念什么吗? 问题答案: 您也可以调

  • 我已经阅读了本教程和这篇文章,但我不明白每种加载类型的确切用途。 我解释 我有这个POCO: 我明白这一点: > 对于懒惰加载:因为加载是懒惰的,如果我调用dbset将不会加载所有导航属性。这种类型的加载在性能和响应性方面是最好的。默认情况下启用它,如果我想重新启用它,我必须设置: 对于即时加载,它不是懒惰的:当我加载dpc\u-gestion时,它加载了所有导航属性。可以使用方法加载导航属性。要

  • 我正在使用教义2来绘制学术时间表。以下是对这些关系的简化观察: 一个类有事件(一对多) 事件具有类型(多对一) 一个事件有一个位置(多对一) 使用

  • 使用JPA EntityManager和JPA查询对象,我如何覆盖在查询中惰性获取注释@OneToMany(fetch=FetchType.EAGER)的内容? 如果我有hibernate查询对象,我可以让它创建一个criteria对象,并使用它将fetch类型设置为lazy。但我必须使用JPA查询对象。这个问题有什么解决办法吗?