Java JPA:em.find不';t加载一对多集合
我使用EclipseLink作为JPA提供者。我拥有以下实体:Java JPA:em.find不';t加载一对多集合,java,jpa,eclipselink,Java,Jpa,Eclipselink,我使用EclipseLink作为JPA提供者。我拥有以下实体: @Entity class MyItem{ @Id int id; @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL,mappedBy = "item",orphanRemoval = false) @MapKey(name="fooCode") private Map<String,Foo> foos;
@Entity
class MyItem{
@Id
int id;
@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL,mappedBy = "item",orphanRemoval = false)
@MapKey(name="fooCode")
private Map<String,Foo> foos;
...
}
@实体
类MyItem{
@身份证
int-id;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“item”,orphan=false)
@MapKey(name=“fooCode”)
私人地图;
...
}
当我这样做的时候
em.find(MyItem.class,id)
实体管理器只加载MyItem类字段-它不读取@OneToMany集合
我只能使用带有join的JPQL来解决这个问题。但是我想在没有JPQL的情况下实现它。如何?这应该是可行的,您如何测试它是否未加载,以及您是否在字段和属性上都添加注释?我能看到这种情况的唯一方法是,将FetchType.EAGER声明放在由于混合访问类型而无法拾取的注释上。或者您正在读取的EntityManager上下文已经在其缓存中包含您的实体,其中包含不完整的fooscollection@Chris它不起作用。我通过sql查询看到它在日志中不起作用。对不起,什么不起作用?显示查找操作的日志-实体是否已加载到EntityManager上下文中?“查找”可能只命中缓存,因此不需要加载集合。尝试em.refresh(实体)并查看是否加载了地图,如果加载了,请确保您维护了关系的双方。@Chris,正如我所说,集合未加载,只加载了直接字段。正如我所说的,我在SQL查询中看到了它。如果您不显示更多信息,例如显示有问题的查询的日志,并且如果您不愿意检查代码,以查看在查找之前是否在没有引用的情况下插入了实体,我将无能为力。。。还请注意,仅查看sql查询不足以判断引用是否存在:它们可能以前已加载,并且在单独的查询中加载。这应该可以工作,您如何测试它是否未加载,以及是否在字段和属性上都添加注释?我能看到这种情况的唯一方法是,将FetchType.EAGER声明放在由于混合访问类型而无法拾取的注释上。或者您正在读取的EntityManager上下文已经在其缓存中包含您的实体,其中包含不完整的fooscollection@Chris它不起作用。我通过sql查询看到它在日志中不起作用。对不起,什么不起作用?显示查找操作的日志-实体是否已加载到EntityManager上下文中?“查找”可能只命中缓存,因此不需要加载集合。尝试em.refresh(实体)并查看是否加载了地图,如果加载了,请确保您维护了关系的双方。@Chris,正如我所说,集合未加载,只加载了直接字段。正如我所说的,我在SQL查询中看到了它。如果您不显示更多信息,例如显示有问题的查询的日志,并且如果您不愿意检查代码,以查看在查找之前是否在没有引用的情况下插入了实体,我将无能为力。。。还请注意,仅查看sql查询不足以判断引用是否存在:它们可能以前已加载,但无论如何都会在单独的查询中加载。