我有一个小的控制台应用程序,我使用spring-data-jpa和hibernate.在独立控制台应用程序中使用spring-data-jpa及其存储库时,我真的无法弄清楚如何延迟初始化集合.这是我的一些代码:
@Entity
public class User {
...
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="USER_ORDER_ID")
private Set<Order> orders = new HashSet<Order>();
...
}
Run Code Online (Sandbox Code Playgroud)
库:
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
public ArrayList<User> findByFirstNameIgnoreCase(String firstName);
}
Run Code Online (Sandbox Code Playgroud)
服务impl:
@Service
@Repository
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
public ArrayList<User> findByFirstNameIgnoreCase(String firstName) {
ArrayList<User> users = new ArrayList<User>();
users = userRepository.findByFirstNameIgnoreCase(firstName);
return users;
}
Run Code Online (Sandbox Code Playgroud)
我的主要方法:
...
user = userRepository.findByFirstNameIgnoreCase("john").get(0);
orders = user.getOrders();
for (Order order : orders) {
LOGGER.info("getting orders: " + order.getId());
} …Run Code Online (Sandbox Code Playgroud) 我有一个模型有一个相当大的子实体图和hibernate最终制作了大约9个语句懒洋洋地获取所需的所有数据但大约4级深度我得到一个"无法初始化代理 - 没有会话"错误,我是不知道为什么.
调节器
@Transactional(readOnly = true)
@RequestMapping(value = "/v2/plans", method = RequestMethod.GET)
public @ResponseBody List<PlanPresenter> show(HttpServletRequest request) throws Exception {
List<PlanPresenter> planPresenters = new ArrayList<>();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Plan> planQuery = criteriaBuilder.createQuery(Plan.class);
Root<Plan> root = planQuery.from(Plan.class);
if (request.getParameter("region") != null || request.getParameter("group") != null) {
List<Predicate> criteria = new ArrayList<Predicate>();
if (request.getParameter("region") != null) {
criteria.add(criteriaBuilder.equal(root.get(Plan_.region), request.getParameter("region")));
}
if (request.getParameter("group") != null) {
criteria.add(criteriaBuilder.equal(root.get(Plan_.groupCode), request.getParameter("group")));
criteria.add(root.get(Plan_.planSetId).in(groupPlanSetIds));
} else {
criteria.add(root.get(Plan_.planSetId).in(currentPlanSetIds));
}
Query query = entityManager.createQuery(planQuery.where(criteriaBuilder.and(criteria.toArray(new Predicate[]{}))));
for (Plan …Run Code Online (Sandbox Code Playgroud) 我正在为实体对象上的延迟加载集合执行此操作:
@Transactional(readOnly = true)
public T getWithAssociation(final long id, String association) {
Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(genericType);
crit.setFetchMode(association, FetchMode.JOIN);
crit.add(Property.forName("id").eq(id));
return (T) crit.uniqueResult();
}
Run Code Online (Sandbox Code Playgroud)
我想与多个延迟加载的集合返回一个实体对象加载的,我能做到这一点(通过在列表中,并设置超过联想单个标准是什么?):
@Transactional(readOnly = true)
public T getWithAssociations(final long id, List<String> associations) {
Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(genericType);
for(String association:associations) {
crit.setFetchMode(association, FetchMode.JOIN);
}
crit.add(Property.forName("id").eq(id));
return (T) crit.uniqueResult();
}
Run Code Online (Sandbox Code Playgroud)