2014-10-30 94 views
1

我对Spring非常陌生,我试图弄清楚如何使用@ElementCollection。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; 
    } 
} 

库:

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

    } 

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

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

我该如何解决这个没有FetchType.EAGER?

回答

2

findById(long id)执行中,加上这个​​。

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

编辑

随着春天的数据,你显然没有实现,所以你可以指定将要使用的查询,在查询中获取数据(这个问题被打上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); 
} 
+0

对不起,但我不明白。我在春天真的很新鲜。我如何将它添加到界面?我没有实现这个接口。它由Spring自动生成 – LSO 2014-10-30 11:06:21

+0

你没有提到你正在使用Spring Data,所以我认为你已经实现了。 – 2014-10-30 11:13:32

+0

看到我编辑的答案,希望它有帮助。 – 2014-10-30 11:27:22

相关问题