0

国際化されたデータベース設計のアプローチを選択することについて多くの議論をした後、私は翻訳が必要なテーブルごとに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プロバイダーに縛られていません。

どんな助け/ガイダンスも大歓迎です

4

1 に答える 1

0

1つのcatエントリに対してcat_tには多くの行が存在する可能性があるため、catはcat_tと1対多の関係にあるようです。これは、単一のエンティティに含めるのは理想的ではありません。これは、インスタンスがデータを共有し、変更を加えると無限の頭痛の種になることを意味するためです。

更新を可能にするより良いアプローチは、catとcat_tを別々のエンティティにマップすることです。CatにはCat_t?Localインスタンスのコレクションがあります。cat_tにマッピングするエンティティは、ローカルおよびCatへのManyToOneバックポインタをIDとして使用できます。

@Entity
@IdClass(TranslationKey.class)
public class Local {
  @ID
  private String locale;
  @ID
  @ManyToOne
  private Cat cat;
}

public class TranslationKey{
  string local;
  long cat;
}
于 2013-02-04T13:57:42.233 に答える