我正在使用spring-boot
和sping-data
开发Hibernate
个应用程序。我创建了一些具有OneToMany
或ManyToMany
等关联的实体,如:
@Entity
public class Department {
@OneToMany(mappedBy="department", cascade=CascadeType.ALL)
private Set<Employee> employees;
public void addEmployee(Employee emp) {
emp.setDepartment(this);
employees.add(emp);
}
}
默认FetchType
OneToMany
的{{1}} LAZY
位于JPA
或Hibernate
。我使用Department
的方法在Transactional
Service
内使用实体JpaRepository
加载:
@Service
@Transactional
public class DepartmentService {
DepartmentRepository repo;
public Department findById(Long id) {
return repo.findOne(id);
}
}
public interface DepartmentRepository extends JpaRepository {
}
当我在@Controller
或POST
方法中使用GET
注释的类中加载实体时:
public class DepartmentController {
DepartmentService departmentService;
@RequestMapping(value = "/admin/departments/{did}", method = RequestMethod.POST)
public String update() {
Department dep = departmentService.findById(did);
dep.add(new Employee());
...
}
}
然后我可以访问这些关联,我可以将Employees
添加到Department
。实体似乎是persistent
而不是detached
。
当我在Unit Test
中执行相同操作时,实体Department
为detached
我获得LazyInitializationException
,除非我使用{{1注释Unit Test
类}}。我没有在@Transactional
配置中设置OpenSessionInViewFilter
。为什么Spring / Hibenate
中的实体是持久性的?