ElementCollection和“未能懒惰地初始化一个角色集合”异常
问题描述:
我对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?
答
在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);
}
对不起,但我不明白。我在春天真的很新鲜。我如何将它添加到界面?我没有实现这个接口。它由Spring自动生成 – LSO 2014-10-30 11:06:21
你没有提到你正在使用Spring Data,所以我认为你已经实现了。 – 2014-10-30 11:13:32
看到我编辑的答案,希望它有帮助。 – 2014-10-30 11:27:22