簡體   English   中英

FetchType.EAGER不獲取對象

[英]FetchType.EAGER do not fetch object

我的實體:

@Entity
@NoArgsConstructor
public class Company {

  @Id
  @Getter
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "agent_id")
  private Agent agent;

}

@Entity
@NoArgsConstructor
public class Agent {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Getter
  private Long id;

  @Column(unique=true)
  @Getter
  private String name;
}

和問題方法

@Transactional
public void update(Company entity) {
    Company existing = companyRepository.getOne(entity.getId());
    //System.out.println(existing.getAgent().getName());
    em.detach(existing);
    System.out.println(existing.getAgent()); // => org.hibernate.LazyInitializationException: could not initialize proxy - no Session
}

最后一行導致LazyInitializationException,如果我取消注釋System.out.println(),則一切正常。 因此,它看起來像FetchType.LAZY。 我究竟做錯了什么?

使用findOne()方法代替getOne()

方法findOne() -內部調用實體manager.getReference(...)

getReference()的結果將其返回為代理的返回對象,而不是實際的實體對象類型。 因此,當您退出update()方法時,就無法再調用代理。

我建議您閱讀有關JPA代理如何工作以及如何使用Hibernate取消代理的信息。

區別在於:

getOne() -延遲加載

findOne() -不是

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM