2015-02-17 3 views
0

У меня есть цель создать структуру БД с файлами таблицыData, где будут храниться информация о загруженных файлах и другие таблицы для других объектов.Моделирование структуры Hibernate - DataBase

Некоторые объекты могут быть связаны с таблицей filesData, например, таблицами сообщений в блоге, новостями и т. Д. Каждый из этих объектов должен иметь много связанных файлов. Например, в новостной ленте может быть много фотографий. В этом случае следует использовать «средние» таблицы для каждого типа, т. Е. Для новостного сообщения shuold должно быть 3 таблицы: NewsTable, NewsToFilesRelationsTable, filesData. Это стандартный способ.

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

@MyFileAnnotation 
public void setFiles(Set<FilesData> fd) { 
     this.fd= fd; 
} 

Но как хранить эти данные? Я не хочу делать «средние» таблицы с отношением объектов к записям файлов в таблице filesData. Другой вариант - сделать одну таблицу filesDataRelation и сохранить данные отношений в этой таблице. В этом случае - какая структура этой таблицы должна быть? Эта таблица должна иметь не только идентификатор записи связанного объекта, но также должна иметь строку с типом данных объекта (это может быть полное имя таблицы объекта).

Как построить этот способ?

ответ

0

Решение очень простое.

Я создал таблицу framework_files и сопоставил ее JPA с объектом FrameworkFiles implements java.io.Serializable. В этой таблице представлены столбцы linkedObjectID int и linkedObjectName varchar(250).

В других таблицах, например, в таблице publicSitePortfolioWorks, которые сопоставлены с public class PublicSitePortfolioWorks implements java.io.Serializable {, есть несколько столбцов и столбцов id int (PK) и linkedObjectName varchar(250). Столбец linkedObjectName во всех строках (записях) имеет одно (статическое?) Значение, что может быть таким же, как имя таблицы. Например:

ID | SomeCols | linkedObjectName

1 | блаблабла | publicSitePortfolioWorks

2 | блаблабла | publicSitePortfolioWorks

3 | блаблабла | publicSitePortfolioWorks

Entity объектов PublicSitePortfolioWorks из таблицы publicSitePortfolioWorks, связанных с дочерней таблицы, как один-ко-многим с кодом

@JoinColumns({ 
     @JoinColumn(name = "linkedObjectID", referencedColumnName = "id"), 
     @JoinColumn(name = "linkedObjectName", referencedColumnName = "linkedObjectName") 
    }) 
    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) 
    private List<FrameworkFiles> framework_files1 = new ArrayList<>(); 

Где name = "linkedObjectID" - это имя колонки в детской таблице, referencedColumnName = "id" - это название столбцов текущая таблица, name = "linkedObjectName" - это имя столбцов в дочерней таблице, referencedColumnName = "linkedObjectName" - это имя столбцов в дочерней таблице.

Это решение не претендует на то, чтобы быть самым правильным решением - оно просто работает.

0

Если вы не хотите использовать другую таблицу, то я не думаю, что есть лучший способ сделать это. Возможно, вы хотите рассмотреть возможность использования какой-либо базы данных NoSQL? Недавно я сделал это в своем последнем проекте. Некоторые данные хранятся в Postres, а остальные - в MongoDB. Существует очень хорошая библиотека java для интеграции Mongo. Check spring-data-mongodb

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