Я предполагаю, что ваш контент динамический (например, предоставлен / изменен конечными пользователями). Если это не так, вы можете вместо этого взглянуть на комплектов ресурсов .
Трудно критиковать структуру базы данных, не понимая, чего вы пытаетесь достичь, и вы предоставили очень мало описания. Но, предполагая, что topic
и content
являются единственными атрибутами, которые будут иметь ваши страницы, и их необходимо локализовать, я бы предложил следующее:
1) id
столбец таблицы page
выглядит как суррогатный ключ (так как он имеет тип int
), что хорошо, если на него ссылаются из какой-то другой таблицы. Однако, если вы собираетесь получать содержимое страницы напрямую, вам нужен какой-то способ обращения к страницам без необходимости жесткого кодирования их идентификаторов (что я имею в виду, если мне нужно получить контент для some/path/pageA.html
, как я узнаю, что должен ищите страницу с ID = 173?) Поэтому, если это так, вы можете также сохранить естественный ключ в этой таблице.
2) Я не уверен, что вам нужны столбцы topic
и content
в таблице page
; почему бы не сохранить их в page_l10n
для соответствующей локали? Бывают случаи, когда их можно хранить в таблице page
, но я не думаю, что вы один из них.
3) Наличие отдельной таблицы locale
может иметь смысл, если вы хотите поддерживать переводы только в ограниченное подмножество локалей в отличие от всех доступных локалей.
Что касается отображения, аннотация JoinTable в основном используется для отображения многих ко многим или (несколько необычно) однонаправленного отображения один ко многим; оба они не применимы в вашем случае. Вам понадобится простая коллекция , управляемая с конца ребенка. Что-то вроде:
// in your Page class
@OneToMany(mappedBy="page")
public List<PageLocalization> getPageLocalizations() {
// in your PageLocalization class
@ManyToOne
public Page getPage() {