Интернационализация на уровне БД в Play framework

#hibernate #jpa #internationalization #playframework

#спящий режим #jpa #интернационализация #playframework

Вопрос:

Есть ли чистое решение для многоязычных полей в JPA?

Я думаю об этой структуре БД:

табличный продукт

  --------- -------------- -----  
| Field   | Type         | Key | 
 --------- -------------- -----  
| id      | bigint(20)   | PRI | 
| price   | varchar(255) |     | 
 --------- -------------- -----  
  

таблица product_lang

  ------------------ -------------- -----  
| Field            | Type         | Key | 
 ------------------ -------------- -----  
| id               | bigint(20)   | PRI | 
| lang             | varchar(3)   | PRI | 
| title            | varchar(255) |     | 
| description      | varchar(255) |     | 
 ------------------ -------------- -----  
  

И это класс, который я хотел бы использовать:

 @Entity
public class Product {

  @Id
  public Long id;

  public Double price;

  public Locale lang;

  @Translateable
  public String title;

  @Translateable
  public String description;
}
  

Ответ №1:

Я не совсем уверен, что вы можете сопоставить один объект с двумя таблицами так, как вы предлагаете. Аналогично тому, что вы хотите, вы можете сохранить переводы как:

 @CollectionOfElements
Map<String, String> titles;
  

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

Комментарии:

1. Это действительно может быть моим запасным решением, но как я могу искать каждый продукт с заголовком, который мне нравится ‘%book%’ (если у вас есть локаль). Можно ли это сделать только в hql? В игре вы можете использовать что-то вроде Product.find(«byTitleLike», «%book%»). выборка();

2. @Крис Пайпен Играй! позволяет использовать hql внутри find. Вы можете поместить туда запрос

3. Как насчет того факта, что большую часть времени требуется только один элемент?

Ответ №2:

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

Просто проверьте langage, чтобы получить правильное подключение к БД.

Комментарии:

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

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

3. @Zenklys влияние на производительность не будет таким большим, особенно при использовании правильного кэширования и индексации.

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