【发布时间】:2014-08-19 11:19:41
【问题描述】:
因此,手头的问题是关于初始化“未知”实体的惰性集合,只要它们至少按名称已知即可。这是我在 JSF + Primefaces 中构建通用 DataTable -> RecordDetails miniframework 的更广泛努力的一部分。
因此,关联通常是惰性的,我需要加载它们的唯一时刻是当有人访问数据表中的许多记录以查看/编辑它时。这里的问题是控制器是通用的,为此我还只使用一个服务类来支持数据表的整个 LazyLoading 并从详细信息部分加载/保存记录。
到目前为止,我所拥有的是以下代码:
public <T> T loadWithDetails(T record, String... associationsToInitialize) {
final PersistenceUnitUtil pu = em.getEntityManagerFactory().getPersistenceUnitUtil();
record = (T) em.find(record.getClass(), pu.getIdentifier(record));
for (String association : associationsToInitialize) {
try {
if (!pu.isLoaded(record, association)) {
loadAssociation(record, association);
}
} catch (..... non significant) {
e.printStackTrace(); // Nothing else to do
}
}
return record;
}
private <T> void loadAssociation(T record, String associationName) throws IntrospectionException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {
BeanInfo info = Introspector.getBeanInfo(record.getClass(), Object.class);
PropertyDescriptor[] props = info.getPropertyDescriptors();
for (PropertyDescriptor pd : props) {
if (pd.getName().equals(associationName)) {
Method getter = pd.getReadMethod();
((Collection) getter.invoke(record)).size();
}
}
throw new NoSuchFieldException(associationName);
}
问题是,是否有人开始任何类似的努力,或者是否有人知道以 JPA 方式(不是 Hibernate / Eclipselink 特定)初始化集合而不涉及反射的更愉快的方式?
我能想到的另一种选择是强制所有实体使用
Object getId();
void loadAssociations();
但我不喜欢强迫我的 pojo 仅仅为此实现一些接口的想法。
【问题讨论】:
标签: jpa jpa-2.0 lazy-loading