diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java index c62903dab..58740a966 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java @@ -64,6 +64,8 @@ public interface IOrderElementDAO extends IGenericDAO { */ public OrderElement findParent(OrderElement orderElement); + public void loadOrderAvoidingProxyFor(OrderElement orderElement); + /** * Returns the number of assigned hours for an {@link OrderElement} * diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java index 38406315a..63cd937bf 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java @@ -28,6 +28,8 @@ import java.util.List; 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.GenericDAOHibernate; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.orders.entities.OrderElement; @@ -60,6 +62,9 @@ public class OrderElementDAO extends GenericDAOHibernate @Autowired private ITaskSourceDAO taskSourceDAO; + @Autowired + private IAdHocTransactionService transactionService; + @Override public List findWithoutParent() { Criteria c = getSession().createCriteria(OrderElement.class); @@ -97,6 +102,25 @@ public class OrderElementDAO extends GenericDAOHibernate return (OrderElement) query.uniqueResult(); } + @Override + public void loadOrderAvoidingProxyFor(final OrderElement orderElement) { + OrderElement order = transactionService + .runOnAnotherTransaction(new IOnTransaction() { + + @Override + public OrderElement execute() { + OrderElement current = orderElement; + OrderElement result = current; + while (current != null) { + result = current; + current = findParent(current); + } + return result; + } + }); + findExistingEntity(order.getId()); + } + @Override @Transactional(readOnly = true) public int getAssignedHours(OrderElement orderElement) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java index 24848f6c9..df2a642bf 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java @@ -52,6 +52,8 @@ public class OrderTemplatesModel implements IOrderTemplatesModel { private OrderElementTemplate template; + private TemplatesTree treeModel; + @Override public List getRootTemplates() { return dao.getRootTemplates(); @@ -86,23 +88,18 @@ public class OrderTemplatesModel implements IOrderTemplatesModel { @Override @Transactional(readOnly = true) public void createTemplateFrom(OrderElement orderElement) { - loadParentsInOrderToAvoidProxies(orderElement); + orderElementDAO.loadOrderAvoidingProxyFor(orderElement); OrderElement reloaded = orderElementDAO .findExistingEntity(orderElement.getId()); template = reloaded.createTemplate(); - } - - private void loadParentsInOrderToAvoidProxies(OrderElement orderElement) { - OrderElement current = orderElement; - while (current != null) { - current = orderElementDAO.findParent(current); - } + treeModel = new TemplatesTree(template); } @Override @Transactional(readOnly = true) public void initEdit(OrderElementTemplate template) { this.template = dao.findExistingEntity(template.getId()); + treeModel = new TemplatesTree(this.template); } }