【发布时间】:2014-04-22 07:30:14
【问题描述】:
我有一个带有 spring 数据、jpa 和 hibernate 的 spring mvc 项目。我有一个多语言数据库。我设计了我的数据库和实体。我正在寻找一种按语言查询我的表的最佳实践。我是否必须编写自定义 jpa 查询,或者是否有通用方法来查询我的表。
如果我在数据库或实体设计上有错误,请警告我。
数据库:
CREATE TABLE translation (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id));
CREATE TABLE translation_text (
translation_id BIGINT UNSIGNED NOT NULL,
lang VARCHAR(2),
text VARCHAR(1000));
ALTER TABLE translation_text
ADD FOREIGN KEY (translation_id)
REFERENCES translation(id);
CREATE TABLE category (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
category_name BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (id));
ALTER TABLE category
ADD FOREIGN KEY (category_name)
REFERENCES translation(id);
本地化字符串实体:
@Embeddable
public class LocalizedString {
private String lang;
private String text;
//Constructors and getter setters...
}
多语言字符串实体:
@Entity
@Table(name = "translation")
public class MultilingualString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "lang_key")
@CollectionTable(name = "translation_text", joinColumns = @JoinColumn(name = "translation_id"))
private final Map<String, LocalizedString> map = new HashMap<String, LocalizedString>();
public MultilingualString() {
}
public MultilingualString(String lang, String text) {
addText(lang, text);
}
public void addText(String lang, String text) {
map.put(lang, new LocalizedString(lang, text));
}
public String getText(String lang) {
if (map.containsKey(lang)) {
return map.get(lang).getText();
}
return null;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
类别实体:
@Entity
@Table(name = "category")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Category extends BaseEntity<Long> implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="category_name")
private final MultilingualString categoryName = new MultilingualString();
public Category(String lang, String categoryName) {
this.categoryName.addText(lang, categoryName);
}
public Category() {
super();
}
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCategoryName(String lang) {
return this.categoryName.getText(lang);
}
public void setCategoryName(String lang, String categoryName) {
this.categoryName.addText(lang, categoryName);
}
}
类别存储库:
public interface CategoryRepository extends JpaRepository<Category, Long>{
}
如何将语言参数传递给CategoryRepository 并获取该语言的特定数据?
【问题讨论】:
-
我只是想知道你为什么需要“@Embeddable”,你已经将它映射到“MultilingualString”中,我可能会改变的一件事是“@JoinColumn”来映射增量ID而不是字符串
-
@fyelci 你找到解决办法了吗?
-
检查stackoverflow.com/questions/10693508/… 和vertabelo.com/blog/technical-articles/…。数据库 i18n 可以通过多种方式完成,您可以通过搜索找到它们;)
标签: java spring hibernate jpa spring-data