我见过几个类似的问题有0个好答案。
这应该非常简单。我正在使用 Java JPA,有时想要加载子实体列表,但不是所有时间。不幸的是,当我说要懒惰地获取它时,JPA似乎没有听我的话。我已经 100% 确定在我的代码中没有任何地方以任何方式访问 childEntities 属性。但是,在我的 JPA.em(.)查找(.)调用时,所有子实体仍然会立即加载。这就是我如何声明与注释的关系。
@Entity
@Table(name = "parentEntities")
public class ParentEntity implements Serializable {
....
@OneToMany(mappedBy = "entityPropertyName", fetch = FetchType.LAZY)
public List<ChildEntity> childEntities;
...
}
我是这样加载父实体的:
ParentEntity parentEntity = JPA.em().find(ParentEntity.class, id);
此外,我希望有时能够急切地获取这个集合,并能够动态地告诉JPA何时这样做。不过这是第二步。第一步就是让这个工作正常。
我正在积极寻找你的第二个问题的答案:让JPA有时延迟加载东西,有时急切地加载东西。
至于你的第一个问题,在我看来,你想要的是使用getReference()而不是find()。如果你使用的是Hibernate,那么它会创建一个对象的引用,然后只在需要的时候获取它。
我相信这会有所帮助: 何时使用实体管理器.find() vs 实体管理器.getReference()
我已经这样做了。请参考这个,它也会在那里很好地工作:
@Entity
@Table(name = "member_information")
public class MemberInformation implements Serilizable{
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE},optional = false)
private MemberInformationDetails memberInformationDetailsId;
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(mappedBy = "memberInformationId", cascade = CascadeType.ALL)
private Collection<AccountOpening> accountOpeningCollection;
}
使用@OneToOne(fetch=FetchType.LAZY….)
进行一对一映射,使用@LazyCollection(LazyCollectionOption.TRUE)进行收集。
@Entity
@Table(name = "member_info_details")
public class MemberInformationDetails implements Serializable{
@OneToOne(mappedBy = "memberInformationDetailsId")
private MemberInformation memberInformationId;
.......//getter and setters
}
@Entity
@Table(name = "account_opening")
public class AccountOpening implements Serializable {
@JoinColumn(name = "member_information_id", referencedColumnName = "id", nullable = false)
@ManyToOne(optional = false)
private MemberInformation memberInformationId;
..........//getters and setters
}
当您想要访问集合时,请在之前合并并获取对象:
@Stateless
public class MemberInformationFacade{
..............
public MemberInformation getMemberWithMemberDetails(MemberInformation m) {
m = getEntityManager().merge(m);
try {
m.getMemberInformationDetailsId().getId();
m.getMemberInformationDetailsId().accountOpeningCollection().size();
} catch (Exception e) {
e.printStackTrace();
}
return m;
}
}
我尝试实现简单的一对多关联。在使用调试模式检查item对象后,我发现已经加载了list bids。但是List bids属性是用FetchType.Lazy注释的。一些书籍和网页声称FetchType.lazy是JPA提供者接受或拒绝的提示。但我想知道JPA提供程序在什么情况下忽略FetchType.lazy。提前谢谢你。
我无法在hibernate中急切地加载多态相关对象。我知道默认的FetchType渴望@Any,但我不能急于加载字段。下面是一段代码片段: 当我从hibernate通过id获取它时,会出现延迟初始化异常。我不明白为什么会这样。谁能帮忙吗?
我通过提示检查了它在EclipseLink中的工作情况: 这个链接http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html暗示通过Hibernate是不可能的,建议手动获取。但是,我无法理解如何通过HQL或标准来实现它,特别是如何获得不在实体上但仅存在于数据库上的child.parent_id列。即避
让CriteriaQuery加载多对一个关系而不明确地告诉它,我遇到了一些麻烦,而且要在查询中复制我的实体注释来使其工作,这似乎很奇怪: 除其他字段外,“我的实体计算机”包含以下关系: @ManyToOne(fetch=FetchType.Eage)@JoinColumn(name=“Employee”,nullable=false)private Employee=Null; 据我所知,当我加载
我正在尝试< code>fetchType的示例。懒惰,但是在调试代码时,似乎< code>fetchType。懒惰不起作用。 实体bean:地址 添加了属性为fetch=fetchType的注释@Basic。懒散地在地区赛场上。 我的实体bean由以下代码定义: 使用上述实体 Bean 的方法: 因此,在方法调用之后,当我检查地址对象时,它已经填充了区域字段。 请让我知道我是否缺少某些配置,或者
一些adapter支持过滤策略管理。 这意味着Casbin加载的策略是基于给定过滤器的存储策略的子集。 当解析整个策略成为性能瓶颈时,这将会允许在大型多租户环境中有效地执行策略。 要使用支持的adapter处理过滤后的策略,只需调用 LoadFilteredPolicy 方法。 过滤器参数的有效格式取决于所用的适配器。 为了防止意外数据丢失,当策略已经加载, SavePolicy 方法会被禁用。