0

在为国际化数据库设计选择方法进行了多次辩论之后,我决定为每个需要翻译的表设置两个表。在以下情况下,我在使用 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是语言环境是 cat can subcat 的辅助表的一部分,所以当我尝试时referencedColumn可能不允许,因为它不在同一个表中?我正在使用 EclipseLink,但我并没有真正绑定到 JPA 提供程序。

非常感谢任何帮助/指导

4

1 回答 1

0

cat 似乎与 cat_t 具有一对多的关系,因为 cat_t 中可以有许多行用于单个 cat 条目。这在单个实体中并不理想,因为这意味着您将拥有共享数据的实例,并且如果您进行更改会带来无尽的麻烦。

使更新成为可能的更好方法是将 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 回答