Avoid having Orders as proxies

It can cause ClassCastExceptions when doing orderElement.getOrder

FEA: AnA08S10Reports
This commit is contained in:
Óscar González Fernández 2011-02-14 14:19:51 +01:00
parent e1fe687623
commit 0413e0b3e1
3 changed files with 63 additions and 2 deletions

View file

@ -38,4 +38,6 @@ public interface IWorkReportDAO extends IIntegrationEntityDAO<WorkReport> {
List<WorkReport> getAll();
List<WorkReport> allWorkReportsWithAssociatedOrdersUnproxied();
}

View file

@ -21,13 +21,22 @@
package org.navalplanner.business.workreports.daos;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.navalplanner.business.common.IAdHocTransactionService;
import org.navalplanner.business.common.IOnTransaction;
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.workreports.entities.WorkReport;
import org.navalplanner.business.workreports.entities.WorkReportType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@ -42,6 +51,12 @@ import org.springframework.stereotype.Repository;
public class WorkReportDAO extends IntegrationEntityDAO<WorkReport>
implements IWorkReportDAO {
@Autowired
private IAdHocTransactionService adHocTransactionService;
@Autowired
private IOrderDAO orderDAO;
@SuppressWarnings("unchecked")
@Override
public List<WorkReport> getAllByWorkReportType(WorkReportType workReportType) {
@ -54,4 +69,38 @@ public class WorkReportDAO extends IntegrationEntityDAO<WorkReport>
return list(WorkReport.class);
}
@Override
public List<WorkReport> allWorkReportsWithAssociatedOrdersUnproxied() {
forceOrdersUnproxied();
return list(WorkReport.class);
}
private void forceOrdersUnproxied() {
List<OrderElement> elements = adHocTransactionService
.runOnAnotherReadOnlyTransaction(new IOnTransaction<List<OrderElement>>() {
@Override
public List<OrderElement> execute() {
return getOrderElementsAssociatedWithWorkReports();
}
});
orderDAO.loadOrdersAvoidingProxyFor(elements);
}
private List<OrderElement> getOrderElementsAssociatedWithWorkReports() {
Set<OrderElement> result = new HashSet<OrderElement>();
result.addAll(elementsFrom(getSession().createQuery(
"select w.orderElement from WorkReport w")));
result
.addAll(elementsFrom(getSession()
.createQuery(
"select line.orderElement from WorkReport w JOIN w.workReportLines line")));
return new ArrayList<OrderElement>(result);
}
@SuppressWarnings("unchecked")
private List<OrderElement> elementsFrom(Query orderElementsQuery) {
return orderElementsQuery.list();
}
}

View file

@ -40,11 +40,13 @@ import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.labels.daos.ILabelDAO;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.labels.entities.LabelType;
import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.daos.IOrderElementDAO;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.resources.daos.IWorkerDAO;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.scenarios.IScenarioManager;
import org.navalplanner.business.workreports.daos.IWorkReportDAO;
import org.navalplanner.business.workreports.daos.IWorkReportTypeDAO;
import org.navalplanner.business.workreports.entities.WorkReport;
@ -82,12 +84,18 @@ public class WorkReportModel extends IntegrationEntityModel implements
@Autowired
private IOrderElementDAO orderElementDAO;
@Autowired
private IOrderDAO orderDAO;
@Autowired
private IWorkerDAO workerDAO;
@Autowired
private ILabelDAO labelDAO;
@Autowired
private IScenarioManager scenarioManager;
@Autowired
private IConfigurationDAO configurationDAO;
@ -213,7 +221,7 @@ public class WorkReportModel extends IntegrationEntityModel implements
private void forceLoadPrincipalDataWorkReportLines(WorkReportLine line) {
line.getNumHours();
line.getResource().getShortDescription();
line.getOrderElement().getName();
line.getOrderElement().getOrder();
line.getTypeOfWorkHours().getName();
}
@ -318,13 +326,15 @@ public class WorkReportModel extends IntegrationEntityModel implements
private List<WorkReport> getAllWorkReports() {
List<WorkReport> result = new ArrayList<WorkReport>();
for (WorkReport each : workReportDAO.list(WorkReport.class)) {
for (WorkReport each : workReportDAO
.allWorkReportsWithAssociatedOrdersUnproxied()) {
each.getWorkReportType().getName();
if (each.getResource() != null) {
each.getResource().getShortDescription();
}
if (each.getOrderElement() != null) {
each.getOrderElement().getName();
each.getOrderElement().getOrder();
}
result.add(each);
}