2011-01-19 1 views
4

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

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

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

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

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

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

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

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

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

ответ

1

Один из возможных вариантов;

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

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

    int length; 
    . 
    . 

} 

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

Вы можете добавить другие объекты в класс ColumnMetada, если вам нужны и другие специфические тонкости.

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

3

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

1

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

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

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

+0

Да, я это рассмотрел.Однако моя система в конечном итоге будет использовать и другие системные данные, возможно, до нескольких минут, и писать сущности для каждого из них утомительно. Тогда мне придется постоянно обновлять свои сущности в каждой системе, когда они меняют свои таблицы. Это еще более утомительно. Я бы не сохранил их данные, просто прочитал их и представил, я бы сохранил отношение своих таблиц к моим таблицам, например «внешняя таблица x имеет тип cat», а кошка хорошо определена в моей системе. – rapadura

+0

@antonioP, поэтому это очень трудная задача. – hvgotcodes

+0

вы бы предложили более разумный способ сделать это? Возможно, используя динамический язык? – rapadura

Смежные вопросы