在选择国际化数据库设计方法的争论之后,我选择了每个表需要翻译的两个表。在下列情况下,我在使用ORM时遇到了一些问题。
所以我有以下表格:
cat cat_t subcat subcat_t
------ ------- ---------- ------------
id (pk) cat_id(pk,fk) id(pk) subcat_id(pk,fk)
locale(pk) cat_id(fk) locale(pk)
name name
@Entity
@Table(name = "cat")
@SecondaryTable(name = "cat_t",
pkJoinColumns = @PrimaryKeyJoinColumn(name = "cat_id",
referencedColumnName = "id"))
@IdClass(TranslationKey.class)
public class Category {
@Id
private long id;
@Id
@Column(table = "cat_t")
private String locale;
@Column(table = "cat_t")
private String name;
@OneToMany(fetch = FetchType.LAZY)
private List<SubCategory> subCategories;
// getters and setters
}
@Entity
@Table(name = "subcat")
@SecondaryTable(name = "subcat_t",
pkJoinColumns = @PrimaryKeyJoinColumn(name = "subcat_id",
referencedColumnName = "id"))
@IdClass(TranslationKey.class)
public class SubCategory{
@Id
private long id;
@Id
@Column(table = "subcat_t")
private String locale;
@Column(table = "subcat_t")
private String name;
@Column(name = "cat_id")
private long categoryId;
// getters and setters
}
public class TranslationKey implements Serializable {
private long id;
private String locale;
// getters and setters
}
我的目标是子类别只撤回父级语言环境的子类别。我想我有一些选择,包括分别查询子类别和使字段瞬态或拉回一切(所有语言的所有子类别),然后过滤掉我想要的。
我与@JoinColumn
的问题是,locale是cat can subcat的辅助表的一部分,所以当我尝试referencedColumn
时可能不被允许,因为它不在同一个表?。我正在使用EclipseLink,但我并没有真正依赖于JPA Provider。
非常感谢任何帮助/指导
答案 0 :(得分:0)
cat似乎与cat_t有一对多的关系,因为cat_t中可能有很多行用于单个cat条目。这在单个实体中并不理想,因为这意味着您将拥有共享数据的实例,并且如果您进行更改则会产生无穷无尽的麻烦。
使更新成为可能的更好方法是将cat和cat_t映射到单独的实体,其中Cat具有Cat_t?Local实例的集合。映射到cat_t的实体可以使用本地及其ManyToOne后向指针指向Cat作为其Id:
@Entity
@IdClass(TranslationKey.class)
public class Local {
@ID
private String locale;
@ID
@ManyToOne
private Cat cat;
}
public class TranslationKey{
string local;
long cat;
}