2015-04-08 3 views
2

TL; DR: Как объединить информацию из двух таблиц базы данных в Vaadin Treetable (или, когда выпущен Vaadin 7.5, иерархическая сетка)?Слияние двух таблиц базы данных в один файл Vaadin Treetable


У меня есть приложение Свинг рабочего стола Java, который делает это в настоящее время, хотя, возможно, очень ineffeciently с ArrayLists из Java Beans, что обновления с SQL Server каждые 30 секунд. Ну, теперь я пытаюсь перенести это настольное приложение в веб-приложение Vaadin. У настольного приложения есть возможности входа в систему, и я в конце концов буду беспокоиться о том, чтобы сделать то же самое для веб-приложения, но пока я просто хочу попробовать и получить основную часть этого веб-приложения: The Treetable. Или, надеюсь, скоро, иерархическая Сетка.

Чтобы проиллюстрировать, на что я нацелен, я попытаюсь опубликовать созданный образ, который должен показать, как данные из двух таблиц должны сливаться в третируемый (с использованием частичного снимка экрана моего существующего рабочего стола):

Diagram

Я хорошо осведомлен о том, как использовать РЕГИСТРИРУЙТЕСЬ команду SQL, и я кратко прочитал о Referencing Another SQLContainer, но я все еще на ранних этапах обучения Vaadin и до сих пор пытается обернуть мою голову вокруг SQLContainer, FreeformQue ry, и как мне нужно реализовать FreeformStatementDelegate для моего проекта. Не говоря уже о том, что мне нужно будет создавать флажки для каждой строки, как вы можете видеть на этой фотографии, чтобы она обновляла базу данных при нажатии. И поле с проверкой состояния для флажка будет необходимо для Джобса, у которого есть несколько элементов OrderDetail, в которых завершены только некоторые из этих элементов OrderDetail. Чтобы получить эту работу для моей программы Java Swing, мне пришлось опираться на экспертного разработчика Java, у которого уже была большая часть готового кода, и мальчик, это сложно!

Если кто-нибудь может дать мне представление высокого уровня о том, как выполнить эту задачу вместе с некоторыми примерами, я был бы обязан. Я полностью понимаю, что здесь очень много прошу, и я готов сделать это медленно, шаг за шагом, до тех пор, пока вы. Я действительно хочу полностью понять это, поэтому я не просто копирую код, не думая.

ответ

0

Я никогда не использовал SQLContainer, так что это не тот ответ, который вы хотите. Я просто быстро посмотрел на SQLContainer, и я не уверен, что это послужит вашей цели. Для TreeTable вам понадобится Container Внедрение интерфейса Container.Hierarchical, или таблица поместит вокруг него обертку, и вы должны установить отношения родитель-ребенок вручную. Вероятно, вы могли бы расширить SQLContainer и реализовать методы от Container.Hierarchical в этом классе, но это может усложниться.

В вашей ситуации я думаю, что пойду с реализацией своего собственного контейнера, возможно, продолжу AbstractContainer, чтобы бесплатно получить код слушателя и реализовать Hierarchical. Есть несколько методов для реализации, я знаю, и поэтому это потребует некоторого времени, но большинство методов быстро реализованы, и вы можете начать с основных методов и добавить больше интерфейсов (Ordered, Sortable, Indexed, Filterable, Collapsible, .. .) позже.
Если вы сделаете это правильно, вы получите легко читаемый код, который может быть расширен в будущем без особых проблем, и вы не будете зависеть от будущих версий SQLContainer.

Другое дело, что вы узнаете много о структурах данных (Container, Item, Property), используемых в ваадине. Но, как я сказал, что я не знаю SQLContainer поэтому, возможно, будет лучше ответ говорит вам, что это легко с SQLContainer

Для Checkbox функции вы могли бы пойти отобразить свойство/имя продукта в CheckBox. С Icon и Caption он выглядит почти так, как вы этого хотите. См. http://demo.vaadin.com/sampler/#ui/data-input/other/check-box и установите значок. Полуостановленное состояние может быть выполнено с помощью css.

Надеюсь, это поможет вам найти правильное решение для вашей задачи.

+0

Почему было бы сложно расширить 'SQLContainer' для реализации' Container.Hierarchical'? – Sturm

+0

Это мое мнение, основанное на моем опыте. Это также может быть легко, но большую часть времени я пытаюсь расширить класс, чтобы сделать то, что класс не собирался делать, я в конечном итоге с довольно сложной ситуацией. Но так как я не знаю SQLContainer, это хорошо работает. Возможно, с запросом UNION вместо JOIN, чтобы объединить столбцы (например, имя_пользователя и product_id) и присвоено тому же свойству – raffael

+0

. На самом деле я начинаю думать, что я должен использовать 'JPAContainer' вместо' SQLContainer', поскольку он реализует 'Container .Иерархический' из коробки. Сейчас я читаю об этом и надеюсь, что это не будет сложной установкой, тем более, что я все еще ничего не знаю о Айви и Мавене. Я такой n00b. – Sturm

0

Я признаю, что я начинаю с самим ваадином, и там могут быть гораздо лучшие способы сделать это, но вот что-то, что я издевался над тем, что, похоже, работает. Он не делает все, что вам нужно, но это может быть основой для начала. Самое главное, что для внесения изменений в базу данных вам необходимо обновить SQLContainers, когда что-то в контейнере будет изменено.

import com.vaadin.data.Item; 
import com.vaadin.data.Property; 
import com.vaadin.data.util.HierarchicalContainer; 
import com.vaadin.data.util.sqlcontainer.SQLContainer; 

@SuppressWarnings("serial") 
public class TwoTableHierarchicalContainer extends HierarchicalContainer { 
    private SQLContainer parentContainer; 
    private SQLContainer childContainer; 
    private String parentPrimaryKey; 
    private String childForeignKey; 

    public TwoTableHierarchicalContainer(SQLContainer parentContainer, SQLContainer childContainer, 
      String parentPrimaryKey, String childForeignKey) { 
     this.parentContainer = parentContainer; 
     this.childContainer = childContainer; 
     this.parentPrimaryKey = parentPrimaryKey; 
     this.childForeignKey = childForeignKey; 
     init(); 
    } 

    private void init() { 
     for (Object containerPropertyIds : parentContainer.getContainerPropertyIds()) { 
      addContainerProperty(containerPropertyIds, Object.class, ""); 
     } 
     for (Object containerPropertyIds : childContainer.getContainerPropertyIds()) { 
      addContainerProperty(containerPropertyIds, Object.class, ""); 
     } 
     for (Object itemId : parentContainer.getItemIds()) { 
      Item parent = parentContainer.getItem(itemId); 
      Object newParentId = parent.getItemProperty(parentPrimaryKey).getValue(); 
      Item newParent = addItem(newParentId); 
      setChildrenAllowed(newParentId, false); 
      for (Object propertyId : parent.getItemPropertyIds()) { 
       @SuppressWarnings("unchecked") 
       Property<Object> newProperty = newParent.getItemProperty(propertyId); 
       newProperty.setValue(parent.getItemProperty(propertyId).getValue()); 
      } 
     } 
     for (Object itemId : childContainer.getItemIds()) { 
      Item child = childContainer.getItem(itemId); 
      Object newParentId = child.getItemProperty(childForeignKey).getValue(); 
      Object newChildId = addItem(); 
      Item newChild = getItem(newChildId); 
      setChildrenAllowed(newParentId, true); 
      setParent(newChildId, newParentId); 
      setChildrenAllowed(newChildId, false); 
      for (Object propertyId : child.getItemPropertyIds()) { 
       @SuppressWarnings("unchecked") 
       Property<Object> newProperty = newChild.getItemProperty(propertyId); 
       newProperty.setValue(child.getItemProperty(propertyId).getValue()); 
      } 
     } 
    } 
} 
Смежные вопросы