gpt4 book ai didi

spring - ElementCollection 和 "failed to lazily initialize a collection of role"异常

转载 作者:行者123 更新时间:2023-12-03 13:32:19 25 4
gpt4 key购买 nike

我对 Spring 很陌生,我正在尝试弄清楚如何使用 @ElementCollection。

我有以下类(class):

@Embeddable
public class Phone {
private String type;
private String areaCode;
@Column(name="P_NUMBER")
private String number;

public Phone() {
}

public Phone(String type, String areaCode, String number) {
super();
this.type = type;
this.areaCode = areaCode;
this.number = number;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}


public String getAreaCode() {
return areaCode;
}

public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}

@Entity
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EMP_ID")
private long id;

@ElementCollection//(fetch=FetchType.EAGER)
@CollectionTable(name = "PHONE", joinColumns = @JoinColumn(name = "OWNER_ID"))
private List<Phone> phones = new ArrayList<Phone>();;

public Employee() {
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public List<Phone> getPhones() {
return phones;
}

public void setPhones(List<Phone> phones) {
this.phones = phones;
}
}

存储库:
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Long>{

public Employee findById(long id);

}

然后我在 main 方法中使用它:
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
EmployeeRepository repository = context.getBean(EmployeeRepository.class);

Phone phone = new Phone("work", "613", "494-1234");
Employee emp = new Employee();
emp.getPhones().add(phone);
repository.save(emp);

emp = repository.findById(1);
for (Phone p : emp.getPhones()) {
System.out.println(p.getNumber());
}

context.close();

}

它抛出异常(当 emp.getPhones() 被调用时):线程“main”org.hibernate.LazyInitializationException 中的异常:未能延迟初始化角色集合:elcol.repository.Employee.phones,无法初始化代理 - 没有 session

如果我将 (fetch=FetchType.EAGER) 添加到 @ElementCollection 注释(在上面的 Employee 类中的代码中注释) - 一切正常。

如果没有 FetchType.EAGER,我该如何解决这个问题?

最佳答案

findById(long id)实现,添加这个 Hibernate.initialize(emp.getPhones()) .

您的存储库服务应该返回您需要的所有已初始化数据,以便调用该服务的客户端保持独立。简而言之,如果您不需要客户端的员工电话,请不要初始化它。如果您确实需要它 - 初始化它。

编辑

使用 spring 数据,您显然没有实现,因此您可以指定将使用的查询,并获取查询中的数据(问题用 jpa 标记,所以我想您可以使用 JpaRepository )

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long>{

@Query("SELECT e FROM Employee e JOIN FETCH e.phones WHERE e.id = (:id)")
public Employee findById(long id);
}

关于spring - ElementCollection 和 "failed to lazily initialize a collection of role"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26649759/

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