У меня есть сложная модель сущности с несколькими сопоставленными коллекциями следующего вида:
public class RoleDAO extends AbstractEntity {
// ...
public static final String PROPERTY_ROLE = "role";
@ManyToOne
private Role role;
// ...
}
public class Role extends AbstractEntity {
// ...
@OptimisticLock(excluded = true)
@LazyCollection(LazyCollectionOption.EXTRA)
@OneToMany(mappedBy = RoleDAO.PROPERTY_ROLE, cascade = { CascadeType.REMOVE })
private List<RoleDAO> roleDAOs = new ArrayList<RoleDAO>();
// ...
}
Существует приблизительно 20 Role
экземпляров с 20 000 RoleDOA
экземпляров для каждого из них.Всякий раз, когда я пытаюсь удалить один объект Role, используя * 1006, Hibernate требует огромного объема памяти.Используя jProfiler для мониторинга удаления, я обнаружил, что Hibernate, похоже, создает гораздо больше RoleDAO
объектов, чем ожидалось - если не все 400 000 из них.
Нормально ли это поведение для Hibernate?
Я работал над этим, удалив каскад и удалив все связанные записи RoleDAO
, используя именованный запрос перед вызовом em.remove()
- но это делает обработку намного более сложной, связанной с полной моделью.
Протестировано с Hibernate v3.3.1.GA в JBoss v4.2.3 ... планируем перейти на JBoss v7 и текущий Hibernate в ближайшем будущем.