在選擇國際化數據庫設計方法的很多辯論之後,我對每個需要翻譯的表進行了兩次表決。在以下情況下,我在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。
任何幫助/指導,非常感謝
Chris謝謝你是對的。我最終做的是爲翻譯表創建另一個實體,然後按照您的建議在這個實體中添加這些實體。至於我的目標是在一個實體中使用正確的區域設置cat-> subcat,我仍然將這些屬性保留在同一個實體中,但使用了@Transient和TypedQueries。我會考慮使用本地的想法,因爲現在我有這些瞬態字段,它可能會令人困惑。 – ZeusSelerim