2013-04-30 24 views
0

我有通常的客戶表,但我希望能夠讓客戶選擇一個標題(如先生,夫人,博士等)。休眠國際化用戶標題

但是,該網站是多種語言。無論他選擇什麼樣的標題,我都希望用他或她正在瀏覽該網站的語言的相同標題來解決他的問題。

所以我想是這樣的:

Customer      CustomerTitles        
--------      -------------- 
titleId  -------|   id 
firstName   |-------- titleId 
lastName      locale 
           titleDescription 

我如何能使用Hibernate註解實現的類有什麼想法?

+0

什麼是您的確切問題? – 2013-04-30 13:03:26

回答

0

這似乎是一個CustomerTitle可以屬於很多客戶,所以它可以與多對一關係(與擁有方的客戶)通過以下方式進行映射:

@Entity 
@Table(name="Customer") 
public class Customer 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private int id; 

    private String firstName; 

    private String lastName; 

    @ManyToOne 
    @JoinColumn(name="titleId") 
    private CustomerTitle title; 

    .... 
} 


@Entity 
@Table(name="CustomerTitles") 
public class CustomerTitle 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private int id; 

    private String title;   

    private String locale; 

    private String titleDescription; 

    .... 
} 
0

首先你需要一個表來映射等效標題。也就是說,國際化標題和拱標題之間的映射。用映射進行種子處理。

然後,我將有一個@JoinColumn字段的拱標題和@Transient國際化標題字段。然後指定@PrePersist處理程序以使用瞬態字段查找並設置拱標題。從這一點你可以使用拱形標題。

0

Finanally我做了,得到了滿意的結果是這樣:

Customer    Title    TitleLocalization 
--------    ------    ----------------- 
id    |---1 id  1---|  id 
titleId  N---|     |---N titleId 
firstName         locale 
lastName         title (localized) 

Customer類:

@Entity 
public class Customer implements Serializable { 

    @ManyToOne(fetch = FetchType.EAGER) 
    private Title title; 
} 

Title類:

@Entity 
public class Title implements Serializable { 

    @OneToMany(mappedBy = "title", fetch = FetchType.EAGER) 
    @MapKey(name = "locale") 
    private Map<Locale, TitleLocalization> localized; 
} 

而且TitleLocalization類:

@Entity 
public class TitleLocalization implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    private Title title; 

    private Locale locale; 

    private String traslation; 

所以我可以「輕鬆」地從視圖中獲取已翻譯的客戶標題:例如,

#{login.currCustomer.title.localized.get(localeManager.currLocale).title}