gpt4 book ai didi

java - Spring DataJPA 中的延迟初始化

转载 作者:行者123 更新时间:2023-12-01 09:04:12 25 4
gpt4 key购买 nike

新年快乐:)

我有一个使用 Hibernate 和 DataJPA 的 Spring MVC 项目。

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "restaurant_id", nullable = false)
@NotNull
private Restaurant restaurant;

正如您所看到的,这里有两个带有急切获取的字段。我想让两者都变得懒惰。我需要使用我在此处所做的 @NamedEntityGraph 注释:

    @NamedQueries({
@NamedQuery(name = Restaurant.GET_BY_ID, query = "SELECT r FROM Restaurant r WHERE r.id=?1"),
})
@Entity
@NamedEntityGraph(name = Restaurant.GRAPH_WITH_MENU_HISTORY, attributeNodes = {@NamedAttributeNode("menuHistory")})
@Table(name = "restaurants")
public class Restaurant extends NamedEntity {

@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY, mappedBy = "restaurant")
@OrderBy(value = "date DESC")
private List<Dish> menuHistory;

public static final String GRAPH_WITH_MENU_HISTORY = "Restaurant.withMenuHistory";

我想知道,我是否会写

@NamedEntityGraph(name = "G_NAME", attributeNodes = {@NamedAttributeNode("user", "restaurant")})

如果我请求其中一个,第二个是否会加载,或者仅根据他的请求加载?可能是,我需要使用两个图表?

最佳答案

根据 JPA 2.1 规范 3.7.4:

The persistence provider is permitted to fetch additional entity state beyond that specified by a fetch graph or load graph. It is required, however, that the persistence provider fetch all state specified by the fetch or load graph.

实际上,@NamedEntityGraph 只是保证哪些字段应该立即加载,但不能保证哪些字段不应该加载。

因此,如果您使用 user 创建 @NamedEntityGraph,则您的持久性提供程序(例如 Hibernate)只能加载 user 字段或两者userrestaurant 领域热切。这取决于实现并且不能保证。

参见this hibernate的问题。

但据我所知,Hibernate 只加载除 @NamedEntityGraph 中指定的简单字段,而不加载惰性关联。

所以如果你使用hibernate,它应该可以工作。

但是,您当然需要两个单独的 @NamedEntityGraph 用于 userrestaurant 字段。

或者您可以使用ad-hoc spring-data-jpa的功能:

@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

@EntityGraph(attributePaths = { "members" })
GroupInfo getByGroupName(String name);

}

使用此代码,您不再需要显式声明@NamedEntityGraph。您可以只指定内联字段。

关于java - Spring DataJPA 中的延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41420688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com