@Entitygraph macht eifrige Attribute faulJava

Java-Forum
Anonymous
 @Entitygraph macht eifrige Attribute faul

Post by Anonymous »

Ich möchte in der Lage sein, die assoziierten "zu viele" Entitäten eifrig zu holen. Also habe ich eine separate "eifrige" Abfragemethode eingeschlossen, die mit @Entitygraph .

Code: Select all

@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;
}
Das Problem ist, dass es irgendwie einen Join von User von to-One-Relation, Konto .

Code: Select all

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;
}
Was es war (mit einem regulären FindById (String) ):

Code: Select all

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>
Was ist es geworden (findEagerlyById(String)
):

Code: Select all

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=?
Es ist seltsam, da ich type = entitygraph.entitygraphType.load angegeben habe. Nach der Dokumentation: < /p>

Code: Select all

        /**
* 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"),
Beachten Sie, dass "nach ihrer angegebenen oder Standard fetCtType" "" angegeben wurde. Wie Sie sich wahrscheinlich bewusst sind, ist der Standardfetschyp von @onetoone fetchtype.eager .

Code: Select all

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

Die Frage ist also, warum es gebrochen ist und wie kann ich es beheben?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post