[英]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.