gpt4 book ai didi

java - FetchType.EAGER 不获取对象

转载 作者:行者123 更新时间:2023-12-02 02:43:13 36 4
gpt4 key购买 nike

我的实体:

@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() - 内部调用entity manager.getReference(...)

getReference() 调用的结果是返回的对象是代理,而不是实际的实体对象类型。因此,当您退出 update() 方法时,您将无法再调用代理。

我建议您阅读How does a JPA Proxy work and how to unproxy it with Hibernate

区别在于:

getOne() - lazy loaded

findOne() - is not

关于java - FetchType.EAGER 不获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45080760/

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