Как бы вы решили это на Java? Любой шаблон проектирования для ссылки на неизвестные данные? - PullRequest
4 голосов
/ 19 января 2011

Моя система должна взаимодействовать с парой других систем и, возможно, в будущем.Веб-приложение имеет внутреннюю модель данных, подходящую для его цели, однако при отображении этих данных веб-приложению потребуется импортировать или отображать данные из других систем.Указано пользователем.Я использую EJB3, и проблема, похоже, заключается в том, как загрузить неизвестные таблицы и отобразить их содержимое в хорошем отформатированном виде?

Допустим, у вас есть класс Entity, такой как

@Entity
public class myDatas() { 
    private String field; private Other data;
    // getters and setters 
}

public interface Other<T>  {
public T getOtherData();

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

Есть ли совершенно другой способ сделать это?Когда вашей сущности нужно сослаться на неизвестную таблицу?

Подходит ли для этого шаблон адаптера?

РЕДАКТИРОВАТЬ: Я, вероятно, мог бы использовать openjpa для обратного сопоставлениясхема базы данных внешних систем для создания класса данных или объекта сущности.Однако я не уверен, смогу ли я сделать это во время выполнения, не будет ли компонент AS должен распознаваться / развертываться компонентом?Если это сработает, хакерский способ - это предоставить кнопку для извлечения таблицы и обратного сопоставления ее с компонентом, а затем перезагрузить ее в AS.Но это так ужасно ...

EDIT2 : Подойдет ли Groovy для чего-то подобного?Я слышал, что это динамический язык.

Ответы [ 3 ]

3 голосов
/ 19 января 2011

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

1 голос
/ 19 января 2011

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

В вашем случае, когда вам придется динамически добавлять системы, хранить их данные не очень хорошая идея.Одно из основополагающих допущений систем, использующих СУРБД, заключается в том, что модель данных хорошо определена и понятна.Если вы не понимаете взаимосвязи заранее, сложно спроектировать модель данных на основе данных.

Еще одна вещь, которую следует учитывать при использовании внешней системы - что произойдет, если они изменят свой API?

1 голос
/ 19 января 2011

Одна возможная опция;

Определить класс, который содержит информацию об одном столбце таблицы

class ColumnMetadata{
    String columnName;
    String columnValue;
    String (maybe enum) dataType;

    int length;
   .
   .

}

и для данных всей строки;Вы можете сохранить List<ColumnMetadata>, представляющий данные одной строки неизвестной таблицы.

Вы можете добавить дополнительные свойства в класс ColumnMetada, если вам потребуются и другие определенные тонкости.

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

...