java – Hibernate Projections/Lazy加载非必需的1对1映射

前端之家收集整理的这篇文章主要介绍了java – Hibernate Projections/Lazy加载非必需的1对1映射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有以下2个班级(为这篇文章修剪)

  1. public class ApplicationVO implements Serializable {
  2. /**
  3. *
  4. */
  5. private static final long serialVersionUID = -3314933694797958587L;
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.IDENTITY)
  8. @Column(name = "id",unique = true,nullable = false)
  9. private Integer id;
  10. @OneToOne(fetch = FetchType.LAZY,mappedBy = "application")
  11. @Cascade({ CascadeType.ALL })
  12. @JsonIgnore
  13. private ApplicationHomeScreenVO applicationHomeScreen;
  14. ...
  15. ...
  16. ...
  17. }
  18. public class ApplicationHomeScreenVO implements Serializable {
  19. /**
  20. *
  21. */
  22. private static final long serialVersionUID = -9158898930601867545L;
  23. @Id
  24. @GeneratedValue(strategy = GenerationType.IDENTITY)
  25. @Column(name = "id",nullable = false)
  26. @JsonProperty("id")
  27. private Integer id;
  28. @OneToOne(fetch = FetchType.LAZY)
  29. @Cascade({ CascadeType.SAVE_UPDATE })
  30. @JoinColumn(name="application_id")
  31. @JsonProperty("application")
  32. protected ApplicationVO application;
  33. ...
  34. ...
  35. ...
  36. }

我正在尝试加载applicationById wuthout加载applicationHomeScreen
不幸的是,延迟加载似乎没有用.我查看了其他帖子,他们建议在@OneToOne注释上设置option = false标志但不幸​​的是,applicationHomeScreen可以是可选的

我现在正在尝试使用预测,但这对我来说也不起作用

当我调用以下方法

  1. public ApplicationVO findApplicationById(Integer applicationId) {
  2. Criteria criteria = currentSession().createCriteria(ApplicationVO.class);
  3. criteria.add(Restrictions.eq("id",applicationId));
  4. criteria.setProjection(Projections.projectionList()
  5. .add(Projections.property("applicationHomeScreen"),"applicationHomeScreen"))
  6. .setResultTransformer(Transformers.aliasToBean(ApplicationVO.class));
  7. ApplicationVO applicationVO = (ApplicationVO) criteria.uniqueResult();
  8. return applicationVO;
  9. }

我得到了堆栈跟踪

  1. java.lang.ArrayIndexOutOfBoundsException: 0
  2. at org.hibernate.loader.criteria.CriteriaLoader.getResultRow(CriteriaLoader.java:168)
  3. at org.hibernate.loader.criteria.CriteriaLoader.getResultColumnOrRow(CriteriaLoader.java:148)
  4. at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:754)
  5. at org.hibernate.loader.Loader.processResultSet(Loader.java:953)
  6. at org.hibernate.loader.Loader.doQuery(Loader.java:921)
  7. at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
  8. at org.hibernate.loader.Loader.doList(Loader.java:2554)
  9. at org.hibernate.loader.Loader.doList(Loader.java:2540)
  10. at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
  11. at org.hibernate.loader.Loader.list(Loader.java:2365)
  12. at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126)
  13. at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682)
  14. at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
  15. at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:402)
  16. at com.dao.database.impl.ApplicationDAOImpl.findApplicationById(ApplicationDAOImpl.java:349)

任何人都可以推荐我可以使用的方法
a)使延迟加载适用于不需要关联的一对一映射
b)使预测工作,所以如果不需要,我不需要加载任何子关联

谢谢
达米安

最佳答案
唯一的选择是遵循以下步骤:

>将@LazyToOne添加到一对一关联:

  1. @OneToOne(fetch = FetchType.LAZY,mappedBy = "application")
  2. @Cascade({ CascadeType.ALL })
  3. @JsonIgnore
  4. @LazyToOne(value = LazyToOneOption.NO_PROXY)
  5. private ApplicationHomeScreenVO applicationHomeScreen;

>配置bytecode enhancement

猜你在找的Spring相关文章