触发器@onetomany lazy fetch

kqhtkvqz  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(204)

我有一个 ExampleRequest 可以选择具有一个或多个 ExampleRequestYear . 它目前是这样配置的(为了简洁起见,省略了不相关的字段和getter/setter,如果您还需要什么,请告诉我):

  1. @Entity
  2. @Table(name = "EXAMPLE_REQUEST")
  3. @SequenceGenerator(name = "EXAMPLE_REQUEST_ID_SEQ", sequenceName = "EXAMPLE_REQUEST_ID_SEQ", allocationSize = 1)
  4. @Cacheable(false)
  5. public class ExampleRequest implements Serializable {
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EXAMPLE_REQUEST_ID_SEQ")
  8. @Column(name="EXAMPLE_REQUEST_ID", nullable = false)
  9. private Long exampleRequestId;
  10. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "exampleRequest")
  11. private List<ExampleRequestYear> exampleRequestYearList;
  12. public ExampleRequest() {
  13. }
  14. public List<ExampleRequestYear> getExampleRequestYearList() {
  15. if(this.exampleRequestYearList == null){
  16. this.exampleRequestYearList = new ArrayList<ExampleRequestYear>();
  17. }
  18. return this.exampleRequestYearList;
  19. }
  20. public void setExampleRequestYearList(List<ExampleRequestYear> exampleRequestYearList) {
  21. this.exampleRequestYearList = exampleRequestYearList;
  22. }
  23. public ExampleRequestYear addExampleRequestYear(ExampleRequestYear exampleRequestYear) {
  24. getExampleRequestYearList().add(exampleRequestYear);
  25. exampleRequestYear.setExampleRequest(this);
  26. return exampleRequestYear;
  27. }
  28. public ExampleRequestYear removeExampleRequestYear(ExampleRequestYear exampleRequestYear) {
  29. getExampleRequestYearList().remove(exampleRequestYear);
  30. exampleRequestYear.setExampleRequest(null);
  31. return exampleRequestYear;
  32. }
  33. }
  34. @Entity
  35. @Table(name = "EXAMPLE_REQUEST_YEAR")
  36. @IdClass(ExampleRequestYearPK.class)
  37. public class ExampleRequestYear implements Serializable {
  38. @Id
  39. @Column(nullable = false)
  40. private Integer year;
  41. @Id
  42. @ManyToOne
  43. @JoinColumn(name = "EXAMPLE_REQUEST_ID", referencedColumnName = "EXAMPLE_REQUEST_ID")
  44. private ExampleRequest exampleRequest;
  45. public ExampleRequestYear() {
  46. }
  47. public void setExampleRequest(ExampleRequest exampleRequest) {
  48. this.exampleRequest = exampleRequest;
  49. }
  50. public ExampleRequest getExampleRequest() {
  51. return exampleRequest;
  52. }
  53. }

部分代码是由ide自动生成的,我现在还在考虑jpa,所以可能有很多设计错误。
当我创建一个新的 ExampleRequest :

  1. ExampleRequest exampleRequest = new ExampleRequest();
  2. ExampleRequestYear exampleRequestYear = new ExampleRequestYear(2020);
  3. request.addExampleRequestYear(exampleRequestYear);

但是,我不知道如何编辑现有的 ExampleRequest 因为我不确定该如何检索链接的实体。根据我读过的文章,延迟抓取应该是自动的,但是当我尝试这样做时:

  1. ExampleRequest exampleRequest = employeeRequestsController.getExampleRequestById(123);
  2. System.out.println(exampleRequest.getExampleRequestYearList().size());

... 我得到一个空指针异常 .size() 因为getter会运行,但既不会初始化空列表,也不会从db中检索项:

  1. public List<ExampleRequestYear> getExampleRequestYearList() {
  2. if(this.exampleRequestYearList == null){
  3. // Field is null and conditional is entered
  4. this.exampleRequestYearList = new ArrayList<ExampleRequestYear>();
  5. // After initialisation, field is still null!
  6. }
  7. return this.exampleRequestYearList;
  8. }

另外,切换到 FetchType.EAGER 完全解决了这个问题。我错过了什么?
有关应用程序设计的更多详细信息。这个 Resource 处理http请求的类与一组 Controller 像这样的课程:

  1. @Stateless(name = "ISomeActionController", mappedName = "ISomeActionController")
  2. public class SomeActionController implements ISomeActionController {
  3. @EJB
  4. private IFooDAO fooDao;
  5. @EJB
  6. private IBarDAO barDao;
  7. @Override
  8. public ExampleRequest getExampleRequestById(Long exampleRequestId) {
  9. return fooDao.getEntityById(exampleRequestId);
  10. }
  11. }

在道的课堂上 EntityManager 注入的是使用过的:

  1. @Local
  2. public interface IGenericDAO<T> {
  3. public T persistEntity(T o);
  4. public T persistEntityCommit(T o);
  5. public void removeEntity(T o);
  6. public void removeEntity(long id);
  7. public T mergeEntity(T o);
  8. public List<T> getEntitiesFindAll();
  9. public List<T> getEntitiesFindAllActive();
  10. public T getEntityById(Object id);
  11. }
  12. public interface IFooDAO extends IGenericDAO<ExampleRequest> {
  13. public void flushDAO();
  14. public ExampleRequest getExampleRequestById(Long exampleRequestId);
  15. }
  16. @Stateless(name = "IFooDAO", mappedName = "IFooDAO")
  17. public class FooDAO extends GenericDAO<ExampleRequest> implements IFooDAO {
  18. public FooDAO() {
  19. super(ExampleRequest.class);
  20. }
  21. @Override
  22. public void flushDAO(){
  23. em.flush();
  24. }
  25. @Override
  26. public ExampleRequest getExampleRequestById(Long exampleRequestId){
  27. String sql = "...";
  28. Query query = em.createNativeQuery(sql, ExampleRequest.class);
  29. //...
  30. }
  31. }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题