2013-02-02 58 views
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有一個問題是locale是cat cat subcat的輔助表的一部分,所以當我嘗試referencedColumn可能不允許,因爲它不在同一個表中。我使用的是EclipseLink,但我並沒有真正綁定到JPA Provider。

任何幫助/指導,非常感謝

回答

0

貓似乎有一個與cat_t一對多的關係,因爲可以在cat_t許多行單個貓條目。這在單個實體中並不理想,因爲這意味着您將擁有共享數據的實例,並且如果您進行了更改,將會有無窮無盡的頭痛。

使更新成爲可能的更好方法是將cat和cat_t映射到單獨的實體,其中Cat具有Cat_t?本地實例的集合。映射到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; 
} 
+0

Chris謝謝你是對的。我最終做的是爲翻譯表創建另一個實體,然後按照您的建議在這個實體中添加這些實體。至於我的目標是在一個實體中使用正確的區域設置cat-> subcat,我仍然將這些屬性保留在同一個實體中,但使用了@Transient和TypedQueries。我會考慮使用本地的想法,因爲現在我有這些瞬態字段,它可能會令人困惑。 – ZeusSelerim