国際化されたデータベース設計のアプローチを選択することについて多くの議論をした後、私は翻訳が必要なテーブルごとに2つのテーブルを用意しました。次の場合、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
は、ロケールが両方の猫のサブキャットのセカンダリテーブルの一部であるためreferencedColumn
、同じテーブルにないために許可されない可能性があることです。私はEclipseLinkを使用していますが、実際にはJPAプロバイダーに縛られていません。
どんな助け/ガイダンスも大歓迎です