Spring 元素集合和;未能延迟初始化角色“的集合”;例外

Spring 元素集合和;未能延迟初始化角色“的集合”;例外,spring,jpa,spring-data,Spring,Jpa,Spring Data,我对Spring非常陌生,我正试图弄清楚如何使用@ElementCollection 我有以下课程: @Embeddable public class Phone { private String type; private String areaCode; @Column(name="P_NUMBER") private String number; public Phone() { } public Phone(St

我对Spring非常陌生,我正试图弄清楚如何使用@ElementCollection

我有以下课程:

@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;
    }
}
它抛出异常(调用emp.getPhones()时):线程“main”org.hibernate.LazyInitializationException中的异常:未能延迟初始化角色集合:elcol.repository.Employee.phones,无法初始化代理-无会话

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

如何在没有FetchType.EAGER的情况下修复此问题?

findById(长id)
实现中,添加此
Hibernate.initialize(emp.getPhones())

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

编辑

对于spring数据,您显然没有实现,因此您可以指定将要使用的查询,并在查询中获取数据(问题标记为
jpa
,因此我猜您可以使用)

@存储库
公共接口EmployeeRepository扩展了JpaRepository{
@查询(“从员工e中选择e加入获取e.phones,其中e.id=(:id)”)
公共雇员findById(长id);
}

对不起,我不明白。我在春天真是个新手。如何将其添加到界面中?我没有这个接口的实现。它是由Spring自动生成的。您没有提到您正在使用Spring数据,所以我假设您已经实现了。是的,它很有帮助。非常感谢。
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Long>{

    public Employee findById(long id);

}
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();

    }
@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);
}