2013-04-30 50 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}