@Entitygraph делает нетерпеливые атрибуты ленивымиJAVA

Программисты JAVA общаются здесь
Anonymous
@Entitygraph делает нетерпеливые атрибуты ленивыми

Сообщение Anonymous »

Я хочу иметь возможность с нетерпением ждать, связанные с тем, что многие ». Поэтому я включил отдельный «нетерпеливый» метод запроса, аннотированный с @Entitygraph .

Код: Выделить всё

@RepositoryDefinition(domainClass = User.class, idClass = Long.class)
public interface UserRepository {

Optional findById(Long id);

@EntityGraph(attributePaths = {"emailData"}, type = EntityGraph.EntityGraphType.LOAD) // this is important
Optional findEagerlyById(Long id);
}
< /code>
// I removed some irrelevant fields

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.util.List;

@Entity
@Getter
@Setter
@Table(name = "\"user\"")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "user")
private Account account;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List emailData;
}
Проблема в том, что он каким-то образом сломал соединение пользователя to-One, Account .

Код: Выделить всё

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;

@Entity
@Getter
@Setter
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
private BigDecimal balance;
}
Что это было (с обычным findbyid (string) ):

Код: Выделить всё

Hibernate: select u1_0.id,a1_0.id,a1_0.balance,u1_0.date_of_birth,u1_0.name,u1_0.password from "user" u1_0 left join account a1_0 on u1_0.id=a1_0.user_id where u1_0.id=?
Hibernate: select ed1_0.user_id,ed1_0.id,ed1_0.email from email_data ed1_0 where ed1_0.user_id=?
< /code>
Чем он стал (findEagerlyById(String)
):

Код: Выделить всё

Hibernate: select u1_0.id,u1_0.date_of_birth,ed1_0.user_id,ed1_0.id,ed1_0.email,u1_0.name,u1_0.password from "user" u1_0 left join email_data ed1_0 on u1_0.id=ed1_0.user_id where u1_0.id=?
Hibernate: select a1_0.id,a1_0.balance,u1_0.id,u1_0.date_of_birth,u1_0.name,u1_0.password from account a1_0 left join "user" u1_0 on u1_0.id=a1_0.user_id where a1_0.user_id=?
Это странно, так как я указал type = entitygraph.entitygraphtype.load . Согласно документации: < /p>

Код: Выделить всё

        /**
* When the jakarta.persistence.loadgraph property is used to specify an entity graph, attributes that are specified
* by attribute nodes of the entity graph are treated as FetchType.EAGER and attributes that are not specified are
* treated according to their specified or default FetchType.
*
* @see [url=https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1#load-graph-semantics]Jakarta
*      Persistence Specification: Load Graph Semantics[/url]
*/
LOAD("jakarta.persistence.loadgraph"),
Обратите внимание, что он сказал "Согласно указанному или по умолчанию fetchtype" . Как вы, вероятно, хорошо знаете, @onetoone тип по умолчанию по умолчанию является fetchtype.eager .

Код: Выделить всё

// jakarta.persistence.OneToOne
FetchType fetch() default FetchType.EAGER;

Итак, вопрос в том, почему он сломался, и как мне это исправить?


Подробнее здесь: https://stackoverflow.com/questions/796 ... butes-lazy

Вернуться в «JAVA»